【问题标题】:CakePHP save objects stateCakePHP 保存对象状态
【发布时间】:2013-05-04 09:17:01
【问题描述】:

我正在试用 cakePHP 框架,我有一个关于对象状态的问题。

以前,我习惯于序列化对象并在重新加载时取消序列化它们。这样,对象始终保持其状态,但我不确定这是否是最佳做法。

跟踪添加到购物车的产品和模型的一般状态的最佳做法是什么?我是否在会话中以某种方式保存对象状态?还是我将数据保留在会话中并在重新加载页面时重建模型?

cakePHP 是否提供了一些我应该知道的关于对象和状态的内置功能?

【问题讨论】:

    标签: php session cakephp


    【解决方案1】:

    以相反的顺序回答您的问题似乎很合适。

    cakePHP 是否提供了一些我应该知道的内置功能 当涉及到对象和状态?

    是的!CakePHP 为 PHP 的 $_SESSION 对象提供了一个 built in wrapper,因此您可以使用提供的便捷方法在其中快速添加和删除对象。

    跟踪添加到 购物车和模型的一般状态?我要保存对象吗 在会话中以某种方式声明?还是我将数据保留在会话中并重建 页面重新加载时的模型?

    我个人从未发现需要在我的应用程序中保留 PHP 类的实例,因为所有框架对象(例如控制器、模型等)通常都是无状态的。由于我将数据库中的记录存储在关联数组中,因此序列化它们没有问题。

    考虑框架的最佳方式是在页面重新加载时拥有状态的唯一方法是您的数据库......如果您选择使用它,还有 Session。

    在您的情况下,我可能会执行以下操作(在您的控制器中):

    public function addProductToCart($productId){
        // find the product in the database (model)
        $product => $this->Product->findById($productId);
        // get the existing state of the basket
        $basket = $this->Session->read('basket');
        // just in case the basket hasn't been initialised
        if($basket == null){
            $basket = array();
        }
        // append the basket to the database
        $basket[] = $product;
        // write the basket to the session
        $this->Session->write('basket', $basket);
    }
    

    请务必阅读documentation,因为它还将向您展示如何在您的视图中使用 Session 对象。

    【讨论】:

    • 伟大的山姆。感谢您的演练。我将尝试使用无状态方法。我总是序列化对象以避免查询数据库,但我想这是你在每个新项目中都需要考虑的事情。
    • 不用担心@RonnieJespersen。我个人发现反过来更有用。首先使用数据库,然后在应用程序启动并运行后使用基于文件的缓存(或会话数据)进行优化。这种方法的优点是只加载你可以确定使用的东西。但请记住,您在会话中保留的越多,在请求之间恢复它可能需要的时间就越长。祝你好运!
    猜你喜欢
    • 2013-09-15
    • 2010-12-27
    • 2010-12-04
    • 2017-05-14
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    相关资源
    最近更新 更多