cakephp configure ::读取值丢失'尝试了不断的,相同的行为

时间:2014-02-09 23:32:37

标签: cakephp configuration before-filter

我的应用程序从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);
}

其他控制器无法使用。尝试配置::同样的事情。

我需要能够从我的应用中的任何位置访问配置值。

你能帮忙吗?

3 个答案:

答案 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,或者值已被覆盖 - 如上所述。