Petits astuces pratiques avec Symfony (1.4)

Durant le développement complet d’un projet, on rencontre forcément quelques bonnes astuces à conserver pour le futur.
Voici quelques-unes d’entre elles.

Pour récupérer une variable brute dans un template

$sf_data->getRaw('ma_variable') au lieu de $ma_variable.

Afficher la structure de votre formulaire Objet

print_r( $this->form->getWidgetSchema() );

Ne pas utiliser de [ et ] dans les noms des widgets

Utilisez plutôt des « _ » => sinon les validateurs ont une tendance à se fâcher… (autrement dit tout plante…)

Épurer le panel « config » (accélère l’affichage de la page en DEV)

Pour se faire, Symfony a tout prévu, grâce aux événements 🙂

1. Ajouter les lignes suivantes dans la méthode setup() votre ProjectConfiguration.class.php
ou encore dans la méthode configure() de votre frontendConfiguration.class.php par exemple :

 // Personnalisation de la barre de debug
$this->dispatcher->connect('debug.web.load_panels', array(
    'sfDebugBarEvents', 'listenToLoadDebugWebPanelEvent'));

2. Ensuite, créer la classe sfDebugBarEvents :

/**
 * Configuration des panels de la Web Debug Bar
 * Possibilité de désactiver des panels dans la fonction ci-dessous.
 * @author Etienne VOILLIOT
 */
class sfDebugBarEvents
{
    /**
     * Evénement appelé dans frontendConfiguration.class.php
     * @param sfEvent $event
     */
    public static function listenToLoadDebugWebPanelEvent(sfEvent $event)
    {
        $event->getSubject()->setPanel(
                'infoslite',
                new myWebDebugPanelConfig($event->getSubject())
        );

        $event->getSubject()->removePanel('config');
        //$event->getSubject()->removePanel('memory');
        //$event->getSubject()->removePanel('cache');
        //$event->getSubject()->removePanel('view');
        //$event->getSubject()->removePanel('logs');
        //$event->getSubject()->removePanel('time');
        //$event->getSubject()->removePanel('mailer');
    }
}

3. Enfin, créer votre propre panel « Config » plus léger

class myWebDebugPanelConfig extends sfWebDebugPanelConfig
{
    public function getPanelContent()
    {
        $config = array(
                'debug'        => sfConfig::get('sf_debug')           ? 'on' : 'off',
                'xdebug'       => extension_loaded('xdebug')          ? 'on' : 'off',
                'logging'      => sfConfig::get('sf_logging_enabled') ? 'on' : 'off',
                'cache'        => sfConfig::get('sf_cache')           ? 'on' : 'off',
                'compression'  => sfConfig::get('sf_compressed')      ? 'on' : 'off',
                'tokenizer'    => function_exists('token_get_all')    ? 'on' : 'off',
                'eaccelerator' => extension_loaded('eaccelerator') && ini_get('eaccelerator.enable') ? 'on' : 'off',
                'apc'          => extension_loaded('apc') && ini_get('apc.enabled')                  ? 'on' : 'off',
                'xcache'       => extension_loaded('xcache') && ini_get('xcache.cacher')             ? 'on' : 'off',
        );

        $html = '<ul>'; 
        foreach ($config as $key => $value) { 
           $html .= '<li class="is'.$value.($key == 'xcache' ? ' last' : '').'">'.$key.'</li>'; 
        }
 $html .= '</ul>';

        $context = sfContext::getInstance();
        //$html .= $this->formatArrayAsHtml('request',  sfDebug::requestAsArray($context->getRequest()));
        //$html .= $this->formatArrayAsHtml('response', sfDebug::responseAsArray($context->getResponse()));
        $html .= $this->formatArrayAsHtml('user',     sfDebug::userAsArray($context->getUser()));
        //$html .= $this->formatArrayAsHtml('settings', sfDebug::settingsAsArray());
        //$html .= $this->formatArrayAsHtml('globals',  sfDebug::globalsAsArray());
        //$html .= $this->formatArrayAsHtml('php',      sfDebug::phpInfoAsArray());
        $html .= $this->formatArrayAsHtml('symfony',  sfDebug::symfonyInfoAsArray());

        return $html;
    }
}

Évidemment, libre à vous de personnaliser le code pour en faire ce que vous voulez…

Traduire/personnaliser les pages d’erreurs

Deux systèmes différents sont utilisés pour les erreurs 404 et 500.
Pour surdéfinir le template d’une erreur 404, il suffit d’ajouter un nouveau module et de demander à Symfony de l’utiliser :
Ajouter dans settings.yml :

all
  .actions:
    error_404_module:     error
    error_404_action:     error404

Vous pourriez d’ailleurs très bien créer d’autres types d’erreurs, genre la 403 pour un accès interdit. Dans ce cas, il faut se créer une exception sfError403Exception par ex, qui redirigera vers le sf_error_403_module configuré. Vous pouvez voir le fonctionnement de la 404 et imiter !

Pour l’erreur 500, il faut ajouter un répertoire « error » dans le répertoire config du projet, puis créer dedans un fichier error.html.php qui sera la surdéfinition du error.html.php de Symfony.