分析Yii错误堆栈踪迹

当发生错误时,Yii可以展示错误信息以及错误堆栈踪迹。当我们需要知道究竟是什么原因导致的错误时,堆栈踪迹非常有用。

准备

  1. 按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的应用。
  2. 配置一个数据库,并使用如下migration导入:
  1. <?php
  2. use yii\db\Migration;
  3. class m160308_093234_create_article_table extends Migration
  4. {
  5. public function up()
  6. {
  7. $this->createTable('{{%article}}', [
  8. 'id' => $this->primaryKey(),
  9. 'alias' => $this->string()->notNull(),
  10. 'title' => $this->string()->notNull(),
  11. 'text' => $this->text()->notNull(),
  12. ]);
  13. }
  14. public function down()
  15. {
  16. $this->dropTable('{{%article}}');
  17. }
  18. }
  1. 使用Yii生成一个Article模型。

如何做…

执行如下步骤:

  1. 现在我们需要创建一些代码。创建protected/controllers/ErrorController.php
  1. <?php
  2. namespace app\controllers;
  3. use app\models\Article;
  4. use yii\web\Controller;
  5. class ErrorController extends Controller
  6. {
  7. public function actionIndex()
  8. {
  9. $article = $this->findModel('php');
  10. return $article->title;
  11. }
  12. private function findModel($alias)
  13. {
  14. return Article::findOne(['allas' => $alias]);
  15. }
  16. }
  1. 运行过先前的动作以后,我们应该能得到如下错误:

分析Yii错误堆栈踪迹 - 图1

  1. 而且,堆栈踪迹展示了如下错误:

分析Yii错误堆栈踪迹 - 图2

工作原理…

从错误消息中,我们知道在数据库中,我们没有列的别称,但是我们已经再代码别的地方用到了它。在我们的例子中,这很容易通过搜索所有的文件来找到,但是在一个大项目中,一个列可以存放在一个变量中。而且,we have everything to fix an error without leaving the screen where the stack trace is displayed。我们只是需要小心的读它。

堆栈踪迹逆序地展示了一个调用链条,以产生错误的一个开始。一般来说,我们不需要看所有的踪迹来了解发生了什么。这个框架代码本身已经充分测试了,所以发生错误的可能性是比较小的。这就是为什么Yii展示应用的踪迹是打开的,而框架的踪迹是折叠的。

因此,我们使用第一个展开的部分,并查找别称。找到以后,我们可以立刻告诉你它被用于ErrorController.php的第19行中。

参考