如何在 CakePhp 2.3 中只执行一次与模型相关的代码
How do I execute model-related code only once in CakePhp 2.3
我想要的:
我有一个带有成员函数 update
的模型 Version
。我希望每次加载页面时调用一次此成员函数。
到目前为止我做了什么:
我目前的方法是添加行
ClassRegistry::init('Version')->update();
进入AppController
的beforeFilter()
方法
以前的解决方案是,将以下代码放入 app/Config/bootstrap.php
:
App::uses('CakeEventManager', 'Event');
CakeEventManager::instance()->attach(
function(){
AppModel::getSingletonModel('Version')->update();
},
'Controller.startup'
);
(getSingletonModel
听起来像 - 获取模型的单例实例)
问题:
两种解决方案都有效,但是 如果加载了多个控制器,该函数将被调用多次。这会占用资源。
另外,执行bootstrap.php
时,ClassRegistry
还没有加载。所以我不能直接调用那里的函数。
附加信息:
调用多个控制器的(技术)原因似乎是,在仪表板视图中,某些内容是通过调用 $this->requestAction
生成的。
我的问题:
在 CakePHP 中有没有办法只调用一次函数,就像文件 app/Config/bootstrap.php
,但是 在 加载模型之后?
一些背景:
我正在与其他开发人员一起在 CakePHP 2.3 中开发一个项目。
我正在开发一个自动更新系统,开发人员可以在其中添加一些他们想要 运行 一次的代码(例如,为添加的功能调整数据库)。
看来我刚刚问错了问题。
我通过在 bootstrap.php
中加载 ClassRegistry
使其工作
App::uses('ClassRegistry', 'Utility');
ClassRegistry::init('Version')->update();
我想要的:
我有一个带有成员函数 update
的模型 Version
。我希望每次加载页面时调用一次此成员函数。
到目前为止我做了什么:
我目前的方法是添加行
ClassRegistry::init('Version')->update();
进入AppController
beforeFilter()
方法
以前的解决方案是,将以下代码放入 app/Config/bootstrap.php
:
App::uses('CakeEventManager', 'Event');
CakeEventManager::instance()->attach(
function(){
AppModel::getSingletonModel('Version')->update();
},
'Controller.startup'
);
(getSingletonModel
听起来像 - 获取模型的单例实例)
问题:
两种解决方案都有效,但是 如果加载了多个控制器,该函数将被调用多次。这会占用资源。
另外,执行bootstrap.php
时,ClassRegistry
还没有加载。所以我不能直接调用那里的函数。
附加信息:
调用多个控制器的(技术)原因似乎是,在仪表板视图中,某些内容是通过调用 $this->requestAction
生成的。
我的问题:
在 CakePHP 中有没有办法只调用一次函数,就像文件 app/Config/bootstrap.php
,但是 在 加载模型之后?
一些背景:
我正在与其他开发人员一起在 CakePHP 2.3 中开发一个项目。
我正在开发一个自动更新系统,开发人员可以在其中添加一些他们想要 运行 一次的代码(例如,为添加的功能调整数据库)。
看来我刚刚问错了问题。
我通过在 bootstrap.php
ClassRegistry
使其工作
App::uses('ClassRegistry', 'Utility');
ClassRegistry::init('Version')->update();