Front Controller(app.php)多次调用1次请求

时间:2014-05-20 13:36:48

标签: php symfony front-controller

这是我的问题。

场合

我正在调试symfony2应用程序(发布数据存在一些问题)。在这种情况下,我检查了处理请求时调用app.php与app_dev.php的次数。

例如: 请求(来自浏览器):/ demo / display / foos

app.php中的

记录器(resp.app_dev.php):

//logger function 
function logtxt($logtxt, $name='myLog'){
  $fp = fopen($name.'.txt','a+');
  fseek($fp,SEEK_END);
  $newLog=date('H:i:s', time()).' - '.':'."\r\n".$logtxt."\r\n".'--------------------------------------------';
  fputs($fp,$newLog);
  fclose($fp); //basta
}

//logger call
logtxt('in app_dev.php ('.$_SERVER['SCRIPT_FILENAME'].')');

每次调用logtxt时,它基本上都会在日志文件中添加一行。

问题

在我的应用程序中,似乎多次为单个请求调用app_dev.php(大多数是2次或3次)。我尝试了一个空项目:只在每次请求时按时调用app.php或app_dev.php。

我在想我会做的重定向,但情况并非总是这样。更令人惊讶的是,同一请求的app.php日志计数和app_dev.php日志计数之间有时会有差异!

我不明白为什么在请求中应该多次调用前端控制器。而且,它似乎对生产有一些影响。例如,在一个旧项目中,$ _POST在这些调用之间重置,其数据似乎丢失(!)。

例如,对于同一个请求,我将在dev和prod envs中使用:

15:45:51 - in app_dev.php:
in app_dev.php ($post: {"sort":"sort","property":"barcode"})

15:45:51 - in foo Controller:
fooControllerAction called ($post: {"sort":"sort","property":"barcode"})
--------------------------------------------
15:45:52 - in app_dev.php:
in app_dev.php ($post: [])
--------------------------------------------

而使用app.php log:

15:44:07 - in app.php:
in app.php ($post: {"sort":"sort","property":"barcode"})

--------------------------------------------
15:44:07 - in app.php:
in app.php ($post: [])
--------------------------------------------
15:44:07 - in fooController:
fooControllerAction called ($post: [])
--------------------------------------------

后果: 对于相同的请求,发布的变量可以在开发环境中由控制器使用,但不能在prod环境中使用:

解决方案

有人知道这种行为吗?我渴望了解背景证明这一点,并检查它是否会导致错误。此外,如果这是由于糟糕的开发练习,我会改变我的。

提前感谢您分享您的智慧!

干杯,

1 个答案:

答案 0 :(得分:1)

有关设置内核侦听器的信息,请参阅此页面:

http://symfony.com/doc/current/cookbook/service_container/event_listener.html

...特别是本节涵盖了请求监听器:

http://symfony.com/doc/current/cookbook/service_container/event_listener.html#request-events-checking-types

这里有一个关于如何检测请求是subrequest还是master的示例;)

当您检测到HttpKernel::MASTER_REQUEST作为您的请求类型时,您可以应用您在问题中显示的相同逻辑...