最近这段时间,没有继续我的任氏有无轩的改造,而是不务正业的搞了个小网络应用,地址在这里:http://www.bspmq.com
目前这个站点已经基本可用了。
开发这个站点,前后实际花了不到2天的时间,这个站点本身当然并不复杂,是被我用来练习Symfony开发的。但是就是在这个过程中,还是发现了一个重要的问题。
这个问题出现在应用环境下Symfony对路径的缓存的处理。
Symfony开发的过程一般是这样的:
- 定义一个路径,同时定义这个路径由哪个模块里的哪个动作来操作,也就是说完成route->module/action的映射;
- 在模块中定义相应的处理函数;
- 定义相应的回显模板,并在2中的处理函数中传递要用到的变量。
在这个站点中,本来有这么一个功能:用户创建一个新帖子,然后预览,在预览界面中,用户可以编辑、发布、删除这个帖子。未发布的帖子的status是没有赋值的,只有经过了发布这个步骤后,status改为public,然后页面重新导向回列表界面,就可以看到新的列表了。
在我的开发环境中,这个过程是没有问题的。但是在应用环境,出现了问题: 第一次创建、发布、预览帖子都没有问题;但是在第二次创建帖子的时候,虽然数据库后台已经保存了这第二个帖子,但是在预览界面,还是只能显示第一个帖子的内容,从而造成第二个帖子永远无法被发布的情况。在手工清除缓存后,这个情况消失,但是陷入只能创建、预览、发布第一个帖子,而预览第二个帖子又显示第一个帖子的问题。
由于这个问题在清除缓存后就可以解决,所以问题的焦点就集中到了缓存上。我首先尝试了禁止应用环境下的缓存,但是没有效果;再尝试在程序中删除那个缓存文件,也没有效果。最后只好使用一个折中的方法:
protected function processForm(sfWebRequest $request, sfForm $form)
{
$form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
if ($form->isValid())
{
$bspmq = $form->save();
$url=/bs/.$bspmq->getToken();
$this->redirect($url);
}
这个方法实在很BT,因为原来的处理是:
protected function processForm(sfWebRequest $request, sfForm $form)
{
$form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
if ($form->isValid())
{
$bspmq = $form->save();
$this->redirect($this->generateUrl('bs_show', array('bspmq'=>$bspmq)));
}
在使用原来的方法时,虽然$bspmq变量已经是新的了,但是在重导向时,Symfony还是自作聪明的用了在缓存中的route,从而造成了巨大的困扰。 不过,总的来说,Symfony的开发还是非常迅捷的。
Leave a Reply