我给。一直在寻找和尝试不同的东西几个小时。 使用Cakephp 2.3.5。
我会直截了当地说。 我想在我的Category模型中使用会话变量,但是当我尝试以下任何一种时它不喜欢它...
$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 :(得分: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 laterpublic function bindVendors($marketId) {
$this->bindModel(/*...*/);
}
需要时。
甚至更好,只需在需要时使用条件并在查找选项中声明它们:
[
'contain' => [
'Vendor' => [
'conditions' => /* conditions here */
]
]
]