为调试扩展自定义面板

Yii2-debug扩展是一个强大的工具,可以调试自己的代码,分析请求信息或者数据库查询等等。因此,你可以添加你自己的面板用于任何自定义报告。

准备

按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的yii2-app-basic应用。

如何做…

  1. 在你的网站根路径中创建panels目录:
  2. 添加一个新的UserPanel类:
  1. <?php
  2. namespace app\panels;
  3. use yii\debug\Panel;
  4. use Yii;
  5. class UserPanel extends Panel
  6. {
  7. public function getName()
  8. {
  9. return 'User';
  10. }
  11. public function getSummary()
  12. {
  13. return Yii::$app->view->render('@app/panels/views/summary', ['panel' => $this]);
  14. }
  15. public function getDetail()
  16. {
  17. return Yii::$app->view->render('@app/panels/views/detail', ['panel' => $this]);
  18. }
  19. public function save()
  20. {
  21. $user = Yii::$app->user;
  22. return !$user->isGuest ? [
  23. 'id' => $user->id,
  24. 'username' => $user->identity->username,
  25. ] : null;
  26. }
  27. }
  1. 使用如下代码创建panels/view/summary.php
  1. <?php
  2. /* @var $panel app\panels\UserPanel */
  3. use yii\helpers\Html;
  4. ?>
  5. <div class="yii-debug-toolbar__block">
  6. <?php if (!empty($panel->data)): ?>
  7. <a href="<?= $panel->getUrl() ?>">
  8. User
  9. <span class="yii-debug-toolbar__label yii-debug-toolbar__label_info">
  10. <?= Html::encode($panel->data['username']) ?>
  11. </span>
  12. </a>
  13. <?php else: ?>
  14. <a href="<?= $panel->getUrl() ?>">Guest session</a>
  15. <?php endif; ?>
  16. </div>
  1. 使用如下代码创建panels/view/detail.php视图:
  1. <?php
  2. /* @var $panel app\panels\UserPanel */
  3. use yii\widgets\DetailView;
  4. ?>
  5. <h1>User profile</h1>
  6. <?php if (!empty($panel->data)): ?>
  7. <?= DetailView::widget([
  8. 'model' => $panel->data,
  9. 'attributes' => [
  10. 'id',
  11. 'username',
  12. ]
  13. ]) ?>
  14. <?php else: ?>
  15. <p>Guest session.</p>
  16. <?php endif;?>
  1. 在配置文件config/web.php中打开你的工具栏:
  1. if (YII_ENV_DEV) {
  2. $config['bootstrap'][] = 'debug';
  3. $config['modules']['debug'] = [
  4. 'class' => 'yii\debug\Module',
  5. 'panels' => [
  6. 'views' => ['class' => 'app\panels\UserPanel'],
  7. ],
  8. ];
  9. $config['bootstrap'][] = 'gii';
  10. $config['modules']['gii'] = 'yii\gii\Module';
  11. }
  1. 重新加载index页面,并在调试面板的末尾寻找游客Session

为调试扩展自定义面板 - 图1

  1. 使用admin用户名和admin密码登录到你的站点。在一个成功的例子中,你可以在主菜单中看到你的用户名:

为调试扩展自定义面板 - 图2

  1. 再次浏览调试面板。现在,你将会看到admin用户名:

为调试扩展自定义面板 - 图3

  1. 你可以点击调试面板中的用户名,并看到详细的用户信息:

为调试扩展自定义面板 - 图4

工作原理…

为了给yii2-debug模块创建我们自己的面板,我们需要扩展yii\debug\Panel类,并复写自己的模板方法;

  • getName():调试详情页的菜单项标签名
  • getSummary():调试面板格代码
  • getDetail():详细页视图代码
  • save():你的信息,将会被保存的调试存储中,并从$panel->data字段中获取

你的对象可以存储任何调试数据,并在摘要块和详情页中展示:

在我们的例子中,我们存储用户信息:

  1. public function save()
  2. {
  3. $user = Yii::$app->user;
  4. return !$user->isGuest ? [
  5. 'id' => $user->id,
  6. 'username' => $user->identity->username,
  7. ] : null;
  8. }

在摘要和详情页展示$panel->data字段中的数据。

处理事件

你可以订阅应用的任何事件,或者init()方法中的任何组件。例如,内置yii\debug\panels\MailPanel面板搜集和存储所有被发送的信息:

  1. class MailPanel extends Panel
  2. {
  3. private $_messages = [];
  4. public function init()
  5. {
  6. parent::init();
  7. Event::on(
  8. BaseMailer::className(),
  9. BaseMailer::EVENT_AFTER_SEND,
  10. function ($event) {
  11. $message = $event->message;
  12. $messageData = [
  13. // ...
  14. ];
  15. $this->_messages[] = $messageData;
  16. }
  17. );
  18. }
  19. // …
  20. public function save()
  21. {
  22. return $this->_messages;
  23. }
  24. }

同时,在我们自己的详情页中,它展示一个格子,里边是被存储消息的列表。

参考