我的应用程序从Pages controlleR开始;应用程序需要的第一件事是设置一个配置值-from url-我想在整个应用程序上使用,例如localhost / laborbase / client1我需要将'client1'保持为常量。
所以在AppController中,beforefilter,我分配一个常量(尝试使用Configure ::但同样的问题:其他控制器的值丢失。
AppController的
public function beforeFilter() {
$clienturl = explode('/', $_SERVER['REQUEST_URI']);
if (sizeOf($clienturl) == 3) {
$this->__fetchSettings($clienturl[2]);
}
public function __fetchSettings($value) {
debug('from app'.$value);
//Configure::write('CLIENT_URL', $value);
define("CLIENT_URL", $value);
debug('after assign:'.CLIENT_URL); // THIS SHOWS FINE
}
PagesControler :
public function beforeFilter() {
parent::beforeFilter();
$this->Auth->allow('home', 'homedemo');
}
UsersController :
public function beforeFilter() {
parent::beforeFilter();
$this->Auth->allow('clientLogin', 'add');
}
并显示调用页面操作时的测试值(Pages / display
public function display() {
debug(Configure::read('CLIENT_URL')); // IT SHOWS FINE HERE
...
从UsersController,我无法访问值:常量未定义
public function clientLogin($id = null) {
$this->autoRender = false;
$this->RequestHandler->setContent('json', 'application/json');
ob_end_clean();
///debug(Configure::read('CLIENT_URL'));
echo json_encode(CLIENT_URL);
}
其他控制器无法使用。尝试配置::同样的事情。
我需要能够从我的应用中的任何位置访问配置值。
你能帮忙吗?
答案 0 :(得分:3)
您基本上希望从第一个请求中获取操作,并将其存储在常量中。你可以这样做,当然 - 但常量只能在当前请求中持续,所以你需要使用一个会话来存储下一个请求的值:
您可以将AppController中的类属性共享给所有其他控制器,因为它们都扩展了AppController,或者您可以像当前一样使用常量。我将在此示例中使用类属性。
您需要在AppController中设置属性,并使用Session component:
var $components = array('Session');
public $clienturl = null;
然后你的AppController beforeFilter
:
function beforeFilter() {
// use if(!defined('CLIENT_URL')) for constants
if(!$this->Session->read('clienturl')) {
// the first action is the value you want to save e.g. client1
$this->Session->write('clienturl', $this->action); // save to session
}
// set the class property
$this->clienturl = $this->Session->read('clienturl');
// for constants: define('CLIENT_URL', $this->Session->read('clienturl'));
}
这个过程基本上是说“如果会话变量不存在,则从当前操作创建它。然后,将该变量写入类属性/常量”。
正如您目前所做的那样,您需要在每个控制器中调用AppController的(父)beforeFilter
。用户控制器示例:
public function beforeFilter() {
parent::beforeFilter();
// you can now access:
// class property: $this->clienturl
// for constant: CLIENT_URL
$this->Auth->allow('clientLogin', 'add');
}
现在在clientLogin
:
public function clientLogin($id = null) {
$this->autoRender = false;
$this->RequestHandler->setContent('json', 'application/json');
ob_end_clean();
echo json_encode($this->clienturl);
// echo json_encode(CLIENT_URL); // if using a constant
}
您可以从应用中的任何位置访问此变量/常量,但您需要在当前控制器的beforeFilter
中调用AppController的beforeFilter
,因为当前控制器的beforeFilter
没有'扩展AppController的功能,它会覆盖它,除非你在控制器的beforeFilter
期间调用AppController的功能。
但是,在从操作中保存会话变量的第一页展示后,您可以从应用中的任何位置访问会话变量,而无需调用AppController的beforeFilter
,因为会话变量是在第一次展示时创建的(执行调用它)。
echo $this->Session->read('clienturl');
希望这是有道理和有帮助的。
答案 1 :(得分:1)
您正在PagesController中执行该逻辑,因此它只能在PagesController中使用。如果您希望此逻辑在整个应用程序中工作,那么您必须在appController中具有此逻辑(在PagesController中定义的beforeFilter函数)。
答案 2 :(得分:1)
考虑使用Sessions。这就是他们的目的。
CakePHP SessionComponent提供了一种持久化客户端数据的方法 在页面请求之间。
并且不要在每个请求上设置此值,也许您会意外覆盖它。 Check if it is set or not.
无论如何,Configure类在应用程序范围内可用,所以我认为还有其他错误。也许你在sizeOf($ clienturl)== 3条件变为true之前调用clientLogin(),因此没有设置CLIENT_URL,或者值已被覆盖 - 如上所述。