Включить режим отладки в интерактивном режиме в Symfony - PullRequest
9 голосов
/ 11 марта 2011

Я использую Symfony 1.4 с Doctrine.

Я пытаюсь найти способ включить режим отладки, только если текущий sfUser имеет специальные учетные данные debugger.

Я уже создал фильтр, который отключает панель отладки Symfony, если sfUser не имеет этих учетных данных (web_debug в моем файле settings.yml имеет значение true):

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, он также отключен для отладчиков;поэтому на веб-панели отладки не отображаются операторы Doctrine и временные индикаторы.

Есть ли способ включить режим отладки, только если текущий sfUser имеет точные учетные данные?

Я пытался добавить sfConfig::set('sf_debug', true); к моему checkWebDebugFilter::execute() методу, но поскольку фильтр выполняется после операторов Doctrine, они не записываются.

Я также пыталсядобавьте session_start(); в мой файл index.php, затем просмотрите переменную $_SESSION, чтобы проверить, есть ли у текущего пользователя учетные данные debugger, но это не сработало (и это не было в духе Symfony).

Заранее спасибо за ваши ответы.

Ответы [ 2 ]

1 голос
/ 10 мая 2011

Когда вы передаете параметр отладки в файл index.php, он фактически передается в класс sfApplicationConfiguration вашего приложения.В вашем случае это можно найти в файле / apps / frontend / config / frontendConfiguration.class.php .Класс frontendConfiguration расширяет sfApplicationConfiguration, и здесь вы можете добавить свой код.

Параметр отладки хранится в защищенной переменной этого класса, поэтому вы не сможете изменить его из фильтра, но вы можете создать функцию, например:

setDebug($mode) {
   $this->debug = $mode;
} 

И вызвать еев вашем фильтре:

$this->context->getConfiguration()->setDebug(true);

Вы также можете переопределить функцию isDebug () в классе frontendConfiguration, поскольку она используется в функции initConfiguration () для инициализации индикаторов синхронизации и других отладочных вещей.

if ($this->isDebug() && !sfWebDebugPanelTimer::isStarted())
{
    sfWebDebugPanelTimer::startTime();
}

Но вы не сможете проверить права пользователя здесь, так как класс sfUser не будет инициализирован на этом этапе.Но вы можете проверить глобальные переменные $ _COOKIES или $ _SESSION для значения, которое вы можете установить, когда пользователь входит в систему. Или вы можете вызвать sfWebDebugPanelTimer :: startTime () в вашем фильтре, но пропустите несколько микросекунд.

Я не проверял это, но вот как бы я это сделал.

0 голосов
/ 15 марта 2011

Попробуйте это

если вы хотите включить режим панели web_debug (dev), тогда

http://host_url/frontend_dev.php

или

напишите в свой index.php 'frontend', 'dev', true.

require_once (имя_директории ( FILE ) '/ .. / конфигурации / ProjectConfiguration.class.php.); $ configuration = ProjectConfiguration :: getApplicationConfiguration ('frontend', 'dev', true)); sfContext :: CreateInstance ($ конфигурация) -> отправка ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...