我的Symfony 1.4应用程序“编辑”菜单非常慢。当我点击编辑链接时,响应将近2分钟。
我在我的模块的action.class.php文件中使用以下函数。
public function executeNew(sfWebRequest $request) {
$this->form = $this->configuration->getForm();
$this->employee_attendance = $this->form->getObject();
}
答案 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'
);