【问题标题】:Proper way to inject Session data before model save/validate in CakePHP 1.3?在 CakePHP 1.3 中模型保存/验证之前注入会话数据的正确方法?
【发布时间】:2011-06-04 22:35:33
【问题描述】:

使用 CakePHP 1.3.6

我通过唯一值作为 URL 参数使用无登录身份验证,因此当“受邀”用户访问提供的链接时,我知道他们是谁,并在会话中设置一些用户信息。

在这个页面上是一个表单,有一个父模型和相关的子模型(hasMany、belongsTo 等等)。

每个子模型都有一个“agent_id”字段(FK 到代理模型,在访问页面时加载),需要使用之前在会话中加载的 ID 进行填充。

我是否必须在每个子模型表单元素组旁边为“agent_id”创建一个隐藏的输入字段,还是有更简单的方法?

也许我可以从 Session 或模型/行为beforeValidate() 或类似的东西中获取?这将是理想的,但我不确定如何。

谢谢!

【问题讨论】:

    标签: php session cakephp cakephp-1.3


    【解决方案1】:

    从模型中调用会话值不是一个好习惯(在 MVC 模式中)。该值应由操作提供。

    创建隐藏输入不是个好主意,因为用户可以修改它。

    所以你的代码应该是这样的。

    if (!empty($this->data)) {
        $this->Model->create();
        $this->data['Model']['agent_id'] = $this->Auth->user('id');
        if ($this->Model->save($this->data)) { 
             // success
        }
    }
    

    编辑

    是的,您可以从 Model 读取会话,但它推荐。因为它实际上打破了 MVC 架构。如果你不在乎,你可以使用

    // in your Model.php
    App::import('Model', 'CakeSession');
    $session = new CakeSession();
    

    参考文献

    1. Using Session Vars in a MVC Domain Model library
    2. http://groups.google.com/group/cake-php/browse_thread/thread/163bd9b60aa8757b/80163f0de8c54ad1?lnk=raot&pli=1
    3. http://cakephp.1045679.n5.nabble.com/Checking-user-session-in-model-td1294422.html
    4. read more

    【讨论】:

    • 您可以将会话包含在模型本身中。查看英里的论坛插件了解详细信息:milesj.me/resources/script/forum-plugin 我不同意 ISH - 如果您正在处理行为等问题,这可能是合理的。特别是如果您只阅读会话(而不是修改它),则没有什么反对在模型/行为中使用会话。
    • 是的@mark 你可以使用(read) 会话。但良好的 MVC 实践不推荐它。请阅读我认为的参考文献(在编辑中)。
    • 我同意这不是一件好事,但项目的布局方式,我不确定是否有更好的方法。这些模型与父级相关,并通过父级上的saveAll() 自动保存。我确实认为应该稍后对其进行重构或重新处理,但同时感谢您直接回答。感谢您的帮助和反馈。 =)
    猜你喜欢
    • 2012-05-25
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    相关资源
    最近更新 更多