2011-03-11 31 views
9

Estoy usando Symfony 1.4 con Doctrine.Habilitar el modo de depuración de forma interactiva en Symfony

Estoy tratando de encontrar una forma de habilitar el modo de depuración solo si el actual sfUser tiene una credencial especial debugger.

ya creado un filtro que desactiva la barra de Symfony depuración si el sfUser no tiene esta credencial (la web_debug se establece en true en mi archivo settings.yml):

class checkWebDebugFilter extends sfFilter 
{ 
    public function execute($filterChain) 
    { 
    if(!$this->getContext()->getUser()->hasCredential('debugger')) 
    { 
     sfConfig::set('sf_web_debug', false); 
    } 

    $filterChain->execute(); 
    } 
} 

El código de mi archivo index.php es:

require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php'); 
$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', false)); 
sfContext::createInstance($configuration)->dispatch(); 

el problema es, como el modo de debug está codificado a false en mi index.php, se trata de una también deshabilitado para depuradores; por lo tanto, la barra de depuración web no muestra las instrucciones de Doctrine ni las indicaciones de tiempo.

¿Hay alguna manera de habilitar el modo de depuración solo si el actual sfUser tiene una credencial precisa?

He intentado añadir sfConfig::set('sf_debug', true); a mi método checkWebDebugFilter::execute() pero a medida que el filtro se ejecuta después de declaraciones Doctrina, no se registran.

También probé añadir session_start(); en mi archivo index.php, a continuación, navegar a través de la variable $_SESSION para comprobar si el usuario actual tiene la credencial debugger, pero no funcionó (y que no estaba en el espíritu de Symfony tampoco).

Gracias de antemano por sus respuestas.

+0

Creo que el mejor enfoque es establecer otro contexto cuando el usuario tiene la credencial. Estoy trabajando con una solución pero aún así no pude hacerlo – Pabloks

Respuesta

-1

intente hacer esto si desea activar el panel de web_debug modo

(dev) y luego

http://host_url/frontend_dev.php

o

escritura en su index.php 'frontend', 'dev', cierto.

require_once (dirname (FILE). '/ ../config/ProjectConfiguration.class.php'); $ configuration = ProjectConfiguration :: getApplicationConfiguration ('frontend', 'dev', true)); sfContext :: createInstance ($ configuration) -> dispatch();

+1

Gracias por la respuesta, pero me temo que no entendiste la pregunta; el problema no es activar el modo de depuración sino activarlo _interactively_. Significa que estoy encontrando una forma de cambiar los contenidos de 'index.php' _depending_ en el actual' sfUser' (y una de sus credenciales). – Phen

1

Cuando pasa el parámetro de depuración en el archivo index.php, en realidad se pasa a la clase sfApplicationConfiguration de su aplicación. En su caso, se puede encontrar en el archivo /apps/frontend/config/frontendConfiguration.class.php. La clase frontendConfiguration amplía sfApplicationConfiguration, y aquí puede agregar su código.

parámetro de depuración

se almacena en una variable protegida de esta clase, por lo que no será capaz de cambiarlo de filtro, pero se puede crear una función, por ejemplo:

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

y lo llaman en el filtro:

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

también puede reemplazar la función isDebug() en la clase frontendConfiguration, debido a que se utiliza en la función initConfiguration() para inicializar los indicadores de temporización y otras cosas de depuración.

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

Pero usted no será capaz de verificar los permisos de usuario aquí, ya que la clase sfUser no se ha inicializado en esta etapa todavía. Pero puede verificar las variables globales $ _COOKIES o $ _SESSION para un valor que puede establecer cuando el usuario inicie sesión. O puede llamar a sfWebDebugPanelTimer :: startTime() en su filtro, pero perderá algunos microsegundos.

No he probado esto, pero así es como lo haría.

+0

Gracias por eso. Probé la segunda solución, pero 'session_start()' parece no ser invocado antes 'frontendConfiguration.class.php' ya que recibía algunos avisos ** Variable indefinida: _SESSION **. – Phen

+0

O quizás Symfony desactive la matriz global '_SESSION' después de inicializar su sfUser ... – Phen

Cuestiones relacionadas