繁体   English   中英

是Yii :: app() - >名称缓存在yii上?

[英]is Yii::app()->name cached on yii?

是Yii :: app() - >名称缓存在yii上? 经常使用它好吗? 我决定在我的布局上使用自定义页面标题,我在我的控制器上使用这样的东西。

$this->pageTitle = Yii::app()->name . ":" . $action

它没有缓存缓存,但可以根据需要使用它。 指南

应用程序对象由入口脚本实例化为单例。 可以通过Yii :: app()在任何地方访问应用程序单例。

所以对象已经存在,你只是访问它来读取name属性。


更新 :为了更好地理解这一点,让我们跟踪应用程序生命周期

  • 入口脚本index.php 使用Yii::createWebApplication创建应用程序。
  • Yii::createWebApplication调用Yii::createApplication ,然后创建一个新的CWebApplication对象,这意味着它的构造函数在父CApplication中定义 )被调用。 此构造函数设置应用程序单例对象

     Yii::setApplication($this); 

    然后它执行生命周期的前4个步骤(从上面的应用程序生命周期链接 ):

    1. 使用CApplication :: preinit()预初始化应用程序; 即: $this->preinit();
    2. 设置类自动加载器和错误处理; $this->initSystemHandlers();
    3. 注册核心应用组件; $this->registerCoreComponents();
    4. 加载应用配置; $this->configure($config); 这设置了name
    5. 附加行为; $this->attachBehaviors($this->behaviors);
      加载静态应用组件; $this->preloadComponents();
      使用CApplication::init();初始化应用程序CApplication::init(); $this->init();

    创建的应用程序对象createApplication返回到createWebApplication

  • 然后使用同一个对象调用入口脚本中的run()方法

     Yii::createWebApplication($config)->run(); 

    然后run方法执行生命周期的其余部分:

    1. (6)提出onBeginRequest事件; 即: $this->onBeginRequest(new CEvent($this));

    2. (7)处理用户请求(使用$this->processRequest(); ):

      • 收集有关请求的信息;
      • 创建一个控制器;
      • 运行控制器;

        因此,当您的控制器运行时,如果您调用Yii::app() ,则使用在createApplication中创建并在构造函数中设置的相同对象 ,因此不会创建新对象,并且该属性仅从已经获取现有的对象。

    3. (8)提出onEndRequest事件; 即: $this->onEndRequest(new CEvent($this));

经常使用它好吗?

不,这不好,因为如果有一天您需要修改您的应用名称,那么在每个控制器中更改它都会有问题。 我想更好的方法是直接在layout重新声明Yii::$app->name

在您的布局开始时,可​​能在views/layout/main.php添加

Yii::$app->name = Yii::$app->name . ':' . Yii::$app->getView()->id;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM