我正在使用带有Doctrine的symfony 1.4。
我正在尝试仅在当前sfUser
具有特殊debugger
凭据的情况下才能启用调试模式。
如果sfUser
没有此凭据(我的web_debug
文件中true
设置为settings.yml
),我已经创建了一个停用symfony调试栏的过滤器:
class checkWebDebugFilter extends sfFilter
{
public function execute($filterChain)
{
if(!$this->getContext()->getUser()->hasCredential('debugger'))
{
sfConfig::set('sf_web_debug', false);
}
$filterChain->execute();
}
}
我的index.php
文件的代码是:
require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php');
$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', false));
sfContext::createInstance($configuration)->dispatch();
问题是,由于debug
模式在我的false
中被硬编码为index.php
,因此调试器也会禁用它;因此,Web调试栏不显示Doctrine语句,也不显示时序指示。
只有当前sfUser
具有精确凭据时才能启用调试模式吗?
我尝试将sfConfig::set('sf_debug', true);
添加到我的checkWebDebugFilter::execute()
方法中,但由于在 Doctrine语句之后执行了过滤器,因此不会记录它们。
我还尝试在session_start();
文件中添加index.php
,然后浏览$_SESSION
变量以检查当前用户是否拥有debugger
凭据,但是不工作(也不符合symfony的精神)。
提前感谢您的回答。
答案 0 :(得分:1)
当您在index.php文件中传递debug参数时,它实际上会传递给应用程序的sfApplicationConfiguration类。在您的情况下,可以在 /apps/frontend/config/frontendConfiguration.class.php 文件中找到它。 frontendConfiguration类扩展了sfApplicationConfiguration,在这里你可以添加你的代码。
Debug参数存储在此类的受保护变量中,因此您无法从过滤器更改它,但您可以创建一个函数,例如:
setDebug($mode) {
$this->debug = $mode;
}
并在过滤器中调用它:
$this->context->getConfiguration()->setDebug(true);
您还可以覆盖frontendConfiguration类中的isDebug()函数,因为它在initConfiguration()函数中用于初始化时序指示器和其他调试内容。
if ($this->isDebug() && !sfWebDebugPanelTimer::isStarted())
{
sfWebDebugPanelTimer::startTime();
}
但是你不能在这里检查用户权限,因为sfUser类还没有在这个阶段初始化。但您可以检查$ _COOKIES或$ _SESSION全局变量,以获取用户登录时可以设置的值。或者您可以在Filter中调用sfWebDebugPanelTimer :: startTime(),但会错过几微秒。
我没有测试过这个,但我就是这样做的。
答案 1 :(得分:-1)
试试这个
如果要启用web_debug面板(开发)模式,那么
http://host_url/frontend_dev.php
或
写下你的index.php'frontend','dev',true。
require_once(目录名(文件强>) '/ .. /配置/ ProjectConfiguration.class.php'); $ configuration = ProjectConfiguration :: getApplicationConfiguration('frontend','dev',true)); sfContext ::的createInstance($配置) - >调度();