2015-03-19 46 views
0

我給。一直在尋找和嘗試不同的東西幾個小時。 使用CakePHP 2.3.5。Cakephp需要模型中的session var

我會直接去看它。 我想在我的分類模型中使用一個會話變量,但它不喜歡它,當我嘗試以下任一...

$this->Session->read('market_id') 
CakeSession::read('market_id') 
SessionHelper::read('market_id') 

這裏就是我想要使用它的模型片段...

public $hasAndBelongsToMany = array(
    'Vendor' => array(
     'className' => 'Vendor', 
     'joinTable' => 'categories_vendors', 
     'foreignKey' => 'category_id', 
     'associationForeignKey' => 'vendor_id', 
     'unique' => 'keepExisting', 
     'conditions' => array('market_id' => ????) 
    ) 
); 

我被困在一個獨輪車在泥裏。我已經讀到了爲什麼我不應該在模型中使用會話數據的無數觀點,但這對我來說非常合理,因爲如果沒有這個值,它就永遠不會被調用,並且它不應該返回除market_id之外的其他任何東西。但是這個價值確實改變了。

我完全有責任盡我所能去避免弄亂我的模型。整個骨感控制器的想法...是的...好想法,但我還沒有想出來。事情就這樣了。我第一次嘗試修改模型...我無法弄清楚如何。

回答

0

我讀過的,爲什麼我不應該在模型

這是正確使用會話數據不計其數的意見。它也會導致緊耦合,並使其更難以測試。它不僅適用於模型,而且適用於所有方面。不要創建緊密耦合的代碼。

最好傳遞數據和對象。例如:

// Model Method 
public function getSomething($someSessionValue) { /*...*/ } 
// Controller 
$this->SomeModel->getSomething($this->Session->read('something')); 

如果您需要在很多方法,你的數據,你可以將它設置:

public function setSomeModelProperty($value) { 
    $this->_someProperty = value; // _ because it should be protected, the _ is the convention for that in CakePHP 
} 

不過,我個人非常喜歡去的數據傳遞給每個方法。但這取決於整個場景。

And you can't do this any way because it will cause a syntax error.您不能在屬性聲明中使用變量或屬性。

'conditions' => array('market_id' => ????) 

因此,通過一個方法bind it later

public function bindVendors($marketId) { 
    $this->bindModel(/*...*/); 
} 

在需要的時候。

甚至更​​好,只需使用只在需要時的條件,並在查找選項聲明它們:

[ 
    'contain' => [ 
     'Vendor' => [ 
      'conditions' => /* conditions here */ 
     ] 
    ] 
] 
+0

問號那裏只是爲了告訴你,我需要的變量。我嘗試創建一個私有函數,它將返回會話變量,並使用該方法代替問號,但它失敗了。 – 2015-03-19 00:38:41

+0

我很清楚這一點,但你*不能*在那裏使用一個變量,再次閱讀我的答案部分或關於屬性的PHP手冊。 http://php.net/manual/en/language.oop5.properties.php我的答案提供了三種方法來解決問題,只需選擇一個。 – burzum 2015-03-19 00:39:44

+0

好的。現在有了這個迴應,我明白了。你不能在一個屬性中使用一個變量!所以,我會將我的注意力轉移到試圖找出如何通過查找選項。這實際上是我一直關注的地方,但卻無法讓語法正確。我會保持它。謝謝。 – 2015-03-19 00:46:08