在 Symfony2 的动作之间发送 PDO 的最佳方式是什么?

What's the best way of sending a PDO between actions in Symfony2?

在控制器的操作中,我从数据库加载 PDO 对象并将其发送到树枝模板以呈现数据网格:

/**
 * @Route("/action1", name="action1")
 * @Template()
 */
public function action1Action(Request $request)
{
    $mydata = $this->daoClass->getData();
    return array(
        'mydata' => $mydata
    );
}

$myData 使用 Doctrine 加载,returns 我是一个带有(小)结果数组(PDO 对象)的 PDO 对象。我这样渲染:

<table>
    {% for data in mydata %}
        <tr>
            <td>{{ data.foo }}</td>
            <td>{{ data.bar }}</td>
        </tr>
    {% endfor %}
</table>

所以在 twig 模板中,在带有数据的 table 下方,我得到了将数据发送到下一个操作的表单:

<form action="{{ path('action2') }}" method="post">
    <!-- some javascript populated fields -->
    <input type="hidden" id="field1" name="field1">
   ...
</form>

如何让它也发送呈现网格的 PDO 对象(mydata 对象)?

我试图在第一个操作中将它插入到会话中,以便我可以在下一个操作中检索它,但收到消息:"You cannot serialize or unserialize PDO instances"

有没有更好的方法来做到这一点?

我没有在这个模块中使用 symfony 表单,因为这是一个过于复杂的屏幕,包含大量验证和计算字段,使用表单会复杂得多。

首先,不要因为性能原因做你想做的事情。

你要做的是过早优化,not good

这里有人试图做一个 very similar thing to what you're doing and they are having a hard time

但是,如果您想将用户的信息临时存储到另一个页面,请使用 Symfony Sessions

如果你跳过我说的话,让我重复一遍:

警告:不建议将此代码用于 PDO 结果

use Symfony\Component\HttpFoundation\Session\Session;

$session = new Session();
$session->start();

// set and get session attributes
//Controller ExampleMethodAction1()
$Person = new Person();
$Person->setName('John');
$session->set('PersonObject', $Person);


//Then in another controller method
//Controller ExampleMethodAction2()
$Person = $session->get('PersonObject');
$Person->getName(); //returns John

关于性能的另一件事是,购买更多硬件比雇用新的开发人员来优化代码更便宜。

Is there any better way to do this ?

是的,使用 symfony 表单。

I'm not using symfony forms in this module because this is an overly complex screen with lots of validations and calculated fields and it would be much more complicated to use the forms.

想有多复杂就有多复杂。使用 symfony 表单进行映射、视图和 symfony 验证是非常非常强大的工具。无需编写自己的表单、映射和验证。

What's the best way of sending a PDO between actions in Symfony2?

答案绝对不是将 Doctrine 实体保存到会话或内存缓存中,原因是:

// 从评论中复制

在范围内思考。 PHP 开始,做某事,结束。您只能保存范围不受限制的数据。例如,一个简单的字符串没有作用域。您只能存储此类数据,而不能存储智能 PDO 对象。例如,学说实体实际上只是一些具有 getters 和 setters 的属性,但是学说正在做一些魔术来为它们实现代理模式。因此,他们扩展了一些访问逻辑,如果调用任何 setter 或 getter,则首先从数据库加载对象。如果您要存储它们并重新加载它们,它们将具有对对象的无效引用。