Yii::app()->name 是否缓存在 yii 上?经常使用它好吗?我决定在我的布局上使用自定义页面标题,并在我的控制器上使用它。
$this->pageTitle = Yii::app()->name . ":" . $action
它没有被缓存缓存,但可以随心所欲地使用它。从指南:
应用程序对象由入口脚本实例化为单例。通过 Yii::app() 可以在任何地方访问应用程序单例。
所以对象已经存在,你只是访问它来读取name
属性。
更新:为了更好地理解这一点,让我们跟踪应用程序生命周期:
Yii::createWebApplication
.Yii::createWebApplication
调用Yii::createApplication
,然后创建一个新的 CWebApplication 对象,这意味着它的构造函数(在父 CApplication 中定义)被调用。此构造函数设置应用程序单例对象:
Yii::setApplication($this);
然后它执行生命周期的前 4 个步骤,它们是(来自上面的应用程序生命周期链接):
$this->preinit();
$this->initSystemHandlers();
$this->registerCoreComponents();
$this->configure($config);
。这设置了name
.$this->attachBehaviors($this->behaviors);
$this->preloadComponents();
CApplication::init();
$this->init();
创建的应用程序对象由createApplication
to返回createWebApplication
。
然后使用相同的对象调用入口脚本中的run()
方法:
Yii::createWebApplication($config)->run();
然后该run
方法执行生命周期的其余部分:
(6) 发起onBeginRequest
事件;IE:$this->onBeginRequest(new CEvent($this));
(7) 处理用户请求(带$this->processRequest();
):
运行控制器;
因此,当您的控制器正在运行时,如果您调用在构造函数中创建并设置Yii::app()
的相同对象createApplication
,则会使用,因此不会创建新对象,并且只是从现有对象中获取属性。
(8) 发起onEndRequest
事件;IE:$this->onEndRequest(new CEvent($this));
经常使用它好吗?
不,这不好,因为如果有一天您需要修改您的应用名称,那么您在每个控制器中更改它都会有问题。我想更好的方法是Yii::$app->name
直接在layout
.
在您的布局开始时,可能在views/layout/main.php
添加
Yii::$app->name = Yii::$app->name . ':' . Yii::$app->getView()->id;