Symfony 1.4应用程序“编辑”菜单非常慢

时间:2014-04-23 05:31:35

标签: php performance symfony-1.4

我的Symfony 1.4应用程序“编辑”菜单非常慢。当我点击编辑链接时,响应将近2分钟。

我在我的模块的action.class.php文件中使用以下函数。

public function executeNew(sfWebRequest $request) {
    $this->form = $this->configuration->getForm();
    $this->employee_attendance = $this->form->getObject();
}

1 个答案:

答案 0 :(得分:1)

在Symfony中使用自动生成的表单时存在一个常见的缺陷。当您的表单具有作为相关模型的外键的字段时,则为该元素创建<select>元素。相关值的所有可能值都从数据库中获取并填充为对象。然后在每个对象上使用__toString()方法在列表上显示用户友好值。如果此函数的实现使用另一个相关对象,则分别从数据库中为每个对象读取关系。

例如,如果您的表单中包含相关对象Shift的字段,而__toString类中的Shift方法指的是另一个模型,请说:

function __toString()
{
    return sprintf(
        '%s - %s',
        $this->getShiftType()->getName(),
        $this->getName()
    );
}

然后,对于每个ShiftType,将逐个从数据库中提取Shift。如果您的选择列表数千个班次,则每次打开表单时都会运行相同数量的数据库查询(更不用说为对象提供水分所需的资源)。

有两件事可以解决问题:

  • 通常相关对象的设置方式与用户选择的方式不同,因此您可以完全跳过小部件。您的表单unset($this['shift_id']);函数中有setup之类的内容。

  • 如果您确实需要使用特定的表方法,您将限制从数据库检索的元素数量和/或与任何相关表格连接(在我们的示例中为ShiftType)。您可以在表单中为窗口小部件添加一个选项:

    $this->widgetSchema['shift_id']->addOption(
        'tableMethod', 
        'yourFunctionRetrievingJoinedTables'
    );