【问题标题】:Cakephp need session var in modelCakephp 需要模型中的会话变量
【发布时间】:2015-03-19 00:06:08
【问题描述】:

我给。几个小时以来一直在搜索和尝试不同的东西。 使用 Cakephp 2.3.5。

我会直接说的。 我想在我的类别模型中使用会话变量,但是当我尝试以下任何一种时它不喜欢它......

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

这是我尝试使用的模型 sn-p...

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

我像独轮车一样陷入泥潭。我已经阅读了无数关于为什么我不应该在模型中使用会话数据的意见,但这对我来说非常有意义,因为它永远不会在没有这个值集的情况下被调用,并且它永远不应该返回具有该 market_id 的供应商以外的任何东西.但这个值确实会改变。

我尽我所能避免弄乱我的模型,这让我完全感到内疚。整个瘦控制器的想法......是的......不错的想法,但我还没有弄清楚。就这样。第一次尝试修改模型...我不知道怎么做。

【问题讨论】:

    标签: php class session cakephp session-variables


    【解决方案1】:

    我已经阅读了无数关于为什么我不应该在模型中使用会话数据的意见

    没错。它也会导致紧密耦合并使其更难测试。它不仅对模型有效,对一切都有效。不要创建紧密耦合的代码。

    最好传递数据和对象。例如:

    // 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 */
            ]
        ]
    ]
    

    【讨论】:

    • 问号在哪里只是为了告诉你我需要变量的地方。我尝试创建一个返回会话变量的私有函数,并使用该方法代替问号,但同样失败。
    • 我很清楚这一点,但您不能在那里使用变量,请再次阅读我的答案部分或关于属性的 php 手册。 php.net/manual/en/language.oop5.properties.php我的回答提供了三种解决问题的方法,随便挑一个吧。
    • 好的。现在有了这个回应,我明白了。您不能在属性中使用变量!所以,我将把注意力转向试图弄清楚如何传递查找选项。这实际上是我一直关注的地方,但只是无法正确使用语法。我会坚持下去的。谢谢。
    猜你喜欢
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多