【问题标题】:How can I store request specific 'global' variable in CakePHP如何在 CakePHP 中存储请求特定的“全局”变量
【发布时间】:2013-03-22 08:34:19
【问题描述】:

我想设置一个可在 CakePHP 应用程序中访问的全局变量(在控制器、模型和视图中)。对于进入应用程序的每个请求,变量值可能不同。最好的设置方法是什么?

我想到的一些选项:

  1. 在 bootstrap.php 中使用 Configure::write 来设置这个变量,并在任何地方使用 Configure::read 来读取值。我不确定这是否是最佳选择,因为我找不到任何关于 Configure 数组范围的明确文档。似乎 Configure 通常用于站点范围/应用程序范围的变量,因此不确定每个 HTTP 请求是否都有自己的 Configure 数组。

  2. 将此值写入 bootstrap.php 中的 $GLOBALS 数组。这是一个好主意吗?想不出任何缺点,但似乎不鼓励使用 $GLOBALS。

  3. 以某种方式从 bootstrap.php 导出或设置一个全局变量,该变量的作用域是请求和线程安全的,并且在该请求的应用程序中可用。不知道如何/是否可能。

请帮忙!

【问题讨论】:

  • @pleasedontbelong 当然,会话是一种解决方案 - 虽然并不理想,因为我不希望在请求之间维护状态(通常用于会话)。寻找仅在每个请求的 HTTP 请求-响应范围内自动持续的东西。
  • 您是否考虑将其添加到CakeRequest 对象中?可以在整个应用程序中轻松访问当前请求。虽然我想知道是否应该从您的模型中“检索”这些信息,或者“传递给”模型(我通常更愿意将信息作为参数传递给您的模型,这是一种更简洁的方法)

标签: php cakephp global-variables


【解决方案1】:

在这里配置是你的朋友:

在 AppController 中:

public function beforeFilter() {

    parent::beforeFilter();
    Configure::write('you_variable', 'your_value');

}

您可以使用

在应用中的任何位置(控制器、模型、视图)读取值
Configure::read('your_variable);

【讨论】:

    【解决方案2】:

    您可以在 AppController 中拥有公共变量,并在 beforeFilter() 函数中为其赋值。 像这样的

    class AppController extends Controller {
    
        /**
         * The dependency components needed
         * @var array An array of component names
         */
        public $components = array(
            'Cookie',
            'Session',
            'Auth',
        );
    
        /**
         * The dependency Models needed
         * @var array An array of model names
        */
        public $uses = array(
            'User'
            );
    
        /**
         * Your variable
        */
        public $yourVariable = null;
    
    
    
        public function beforeFilter() {
            parent::beforeFilter();
            $this->yourVariable = 'Your request specific data';            
        }
    

    【讨论】:

    • 这无济于事,因为我需要访问模型和视图中的变量——而不仅仅是控制器
    • 这仅适用于控制器,我错过了您也想在模型中使用它的部分。您可以在 /app/webroot/index.php 中定义它,就像定义 WWW_ROOT 等其他变量一样
    • 对于视图,您只需将其设置为视图 $this->set('yourVariable', $this->yourVariable)
    • “我需要访问模型中的变量” - 您可能会问自己模型是否应该“主动”检索该变量或者它应该作为参数传递,例如$this->Model->findSomething("something", $yourSpecialVariable);。使用这种方法,您将控制“控制器”:D
    猜你喜欢
    • 2016-04-24
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    相关资源
    最近更新 更多