2014-02-09 20 views
4

我的應用程序啓動頁面controlleR;應用程序需要的第一件事是設置一個配置值 - 從url-我想要在整個應用程序上使用,例如localhost/labourbase/client1我需要保持'client1'爲一個常量。cakephp configure ::讀取值丟失'嘗試常量,相同的行爲

在AppController的

所以,beforefilter,我給你一個常數(與配置嘗試::但同樣的問題:價值丟失了其他控制器

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'); 
} 

用戶sController

public function beforeFilter() { 
    parent::beforeFilter(); 
    $this->Auth->allow('clientLogin', 'add'); 
} 

並顯示用於測試的值當頁面操作稱爲(頁/顯示

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

中有什麼PagesController手動授權用戶的原因何在呢?如果他們先訪問另一個控制器,他們如何檢查?我認爲你應該重新思考一切,並從AppController控制你的應用程序。 –

+0

謝謝@ AKKA-Web;我只認證那裏,看看配置值的問題是否與缺少登錄有關。我的應用程序啓動o頁面控制器,因爲從主頁我需要檢索特定於該URL的數據庫信息,例如http:// localhost/laborbase/client1或http:// localhost/laborbase/client2。我真的不需要登錄,只需檢索一些基於URL的數據庫信息。請參閱編輯。 –

+0

這可以幫助你:http://book.cakephp.org/2.0/en/development/routing.html#prefix-routing和http://stackoverflow.com/questions/11705107/cakephp-routes-prefix –

回答

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 
} 

你可以訪問此變量/常量從任何地方在您的應用程序,但你需要有調用AppController中的beforeFilter在當前控制器的beforeFilter ,因爲電流控制器的beforeFilter不延長AppController中的功能,它會除非你控制器的beforeFilter過程中調用AppController中的功能覆蓋。

但是,第一個網頁展示您的session變量正在從動作保存後,您可以從任何地方訪問會話變量在app ,而不必調用AppController中的beforeFilter,因爲會話變量是在第一印象上創建(其中確實調用了)。

echo $this->Session->read('clienturl'); 

希望這是有道理的,並幫助。

+0

非常感謝@scrowler,它就像一個魅力。我已經通過'如果($這個 - >會話級>閱讀(「Client.url」)==「」)'和註銷擺脫了價值'$這 - >會話級>刪除實際檢查會話值( 'Client.url');'。再次感謝你們。 –

1

你正在做PagesController中的那段邏輯,因此它只能在PagesController中工作。如果你想讓這個邏輯在整個應用程序中工作,那麼你必須在appController中有這個邏輯(你在PagesController中定義的beforeFilter函數)。

+0

謝謝@吉勒莫,這是朝着正確方向邁出的一步;如上所述,最終使用Session。謝謝! –

1

考慮使用會話。這是他們設計的。

CakePHP SessionComponent提供了一種在頁面請求之間保存客戶端數據 的方法。

而且不要在每個請求中設置這個值,也許你會意外覆蓋它。 Check if it is set or not.

無論如何,Configure類在應用程序範圍內是可用的,所以我認爲還有其他錯誤。也許你在sizeOf($ clienturl)== 3條件變爲true之前調用clientLogin(),所以沒有設置CLIENT_URL,或者該值已被覆蓋 - 就像我上面提到的那樣。

+0

謝謝@rocknrollcanneverdie;主要針對細節選擇了其他響應。問候。 –

+0

歡迎您。其實這個問題的答案是好多了,因爲我是一個後讀取我的第二部分是錯誤的:) – rocknrollcanneverdie