2010-08-26 3 views
1

J'ai une classe de routage personnalisée qui vérifie le versionnage d'un objet pour permettre la création de versions brouillon de pages qui n'apparaîtront pas sur le site en ligne. Lorsqu'un administrateur clique pour prévisualiser un brouillon d'une page, ma classe PublishingHelper sur le frontal (appelée à partir de la classe de routage) vérifie les autorisations de l'utilisateur pour voir s'il est autorisé à afficher la version brouillon de cette page.Symfony: Comment accéder à l'objet utilisateur au début de l'exécution

J'utilise ce code:

$context = sfContext::getInstance(); 
$user = $context->getUser(); 

Mais $ L'utilisateur est NULL.

Quelqu'un a-t-il des idées? Toutes mes recherches semblent indiquer que c'est la bonne façon d'obtenir l'objet utilisateur.

Merci,

Tom

+0

Peut-être sfContext est pas encore initialisés. Vous pouvez jeter un oeil à initialize() et loadFactories() (ou similaire). – Till

+0

sfContext est initialisé (j'ai vérifié avec $ context-> hasInstance()). J'ai essayé "if ($ user === null) $ context-> loadFactories()" mais cela l'a envoyé dans une boucle récursive, donc ce doit être loadFactories qui lance le processus de routage. – Tom

+0

Utilisez-vous sfGuard? – jgallant

Répondre

0

Merci pour les commentaires Till/Jon, Ive a réussi à résoudre ce problème maintenant. Les correctifs d'usine n'ont pas fonctionné car pendant que la classe d'utilisateurs est instanciée, aucun des filtres n'a été exécuté, donc je me suis retrouvé avec un objet utilisateur inutile. J'ai résolu mes problèmes simplement en prenant à peu près tout le code dans la fonction matchesUrl() de ma classe de routage personnalisée et en mettant une nouvelle fonction doRouting() dans la même classe. matchesUrl() ressemble maintenant à ceci:

public function matchesUrl($url, $context = array()) 
{ 
    if (false === $parameters = parent::matchesUrl($url, $context)) 
    { 
    return false; 
    } 

    $parameters['module'] = 'content'; 
    $parameters['action'] = 'route'; 

    $this->url   = $url; 
    $this->context  = $context; 

    return $parameters; 
} 

et le routage est reporté à après les usines et les filtres en utilisant mon module/contrôleur "content": fonction

class contentActions extends sfActions 
{ 
    public function executeRoute(sfWebRequest $request) 
    { 
    $router = $this->getRoute(); 
    $router->doRouting($router->url, $router->context); 
    } 

Et le doRouting() maintenant redirige directement vers le module/l'action approprié (en prenant correctement en compte les permissions de l'utilisateur).

0

Je pense mettre en œuvre une telle restriction serait plus facile à mettre en œuvre comme un filtre: http://www.symfony-project.org/reference/1_4/en/12-Filters

+0

Je pense que vous avez probablement raison. Cette façon fonctionne bien (comme une sorte de hacky-filtre) donc je ne vais pas le changer, mais gardez à l'esprit pour la prochaine fois. – Tom

Questions connexes