2013-10-17 30 views
5

Symfony2'de (FOSUserBundle kullanmayan) kendi kullanıcı yönetim sistemimi yapıyorum ve kullanıcıları parolalarını değiştirmeye zorlamak istiyorum.Symfony2 - İstek yanıtı istek üzerine iletme EventListener istekte bulunan olayları göz ardı ederken dev modda

kernal.request olayını dinlemek için bir EventListener ayarladıktan sonra kullanıcının parolasını değiştirip değiştirmeyeceğini belirlemek için dinleyicide bir mantık gerçekleştiriyorum; eğer yaparlarsa, bir "Şifre Değiştir" rotasına yönlendirilirler.

Ben kernal.request dinlemek için benim config.yml hizmeti ekleyin:

password_change_listener: 
    class: Acme\AdminBundle\EventListener\PasswordChangeListener 
     arguments: [ @service_container ] 
     tags: 
      - { name: kernel.event_listener, event: kernel.request, method: onMustChangepasswordEvent } 

Ve sonra dinleyici:

public function onMustChangepasswordEvent(GetResponseEvent $event) { 

    $securityContext = $this->container->get('security.context'); 

    // if not logged in, no need to change password 
    if (!$securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')) 
    return; 

    // If already on the change_password page, no need to change password 
    $changePasswordRoute = 'change_password'; 
    $_route = $event->getRequest()->get('_route'); 
    if ($changePasswordRoute == $_route) 
    return; 

    // Check the user object to see if user needs to change password 
    $user = $this->getUser(); 
    if (!$user->getMustChangePassword()) 
    return; 

    // If still here, redirect to the change password page 
    $url = $this->container->get('router')->generate($changePasswordRoute); 
    $response = new RedirectResponse($url); 
    $event->setResponse($response); 
} 

ben yaşıyorum sorun dev modunda, benim dinleyici olmasıdır Ayrıca profiler çubuğu ve yardımcı istek olaylarını yeniden yönlendiriyor. Varlıklara döktüğümde ve önbelleği temizlediğimde ve siteyi üretim modunda görüntülediğimde çalışır.

Assetic/profiler bar/diğer iç denetleyicilerden gelen olayları görmezden gelmenin bir yolu var mı? Veya bir kullanıcıyı change_password sayfasına yönlendirmek için daha iyi bir yol (yalnızca giriş başarısı için değil)?

Çılgın düşünme, vahşi kesmek çözümlerine gidiyor, ama kesinlikle Symfony2'de bunu işlemek için bir yol var mı?

cevap

0

Bu çok kesmek şimdilik kullanıyorum çözümdür:

  1. dev çevre
  2. Eğer öyleyse de,
  3. Filtre rota dizisi böylece tüm yolları bir dizi alırsanız belirleyin sadece eklediğim yollar kalıyor
  4. Geçerli rotayı rota dizisine göre karşılaştır
  5. Bir eşleşme bulunursa, bu olayın yerleşik bir denetleyici olmadığı anlamına gelir, ancak bir tha olmalıdır. Ekledim, yönlendirmeyi yap.

Ve bu yapar delilik iş:

private function getAllNonInternalRoutes($app_name) { 

    $router = $this->container->get('router'); 
    $collection = $router->getRouteCollection(); 
    $allRoutes = $collection->all(); 

    $routes = array(); 

    foreach ($allRoutes as $route => $params) 
    { 
    $defaults = $params->getDefaults(); 

    if (isset($defaults['_controller'])) 
    { 
     $controllerAction = explode(':', $defaults['_controller']); 
     $controller = $controllerAction[0]; 

     if ((strpos($controller, $app_name) === 0)) 
     $routes[]= $route; 
    } 
    } 
    return $routes; 
} 
: ben here by Qoop bulunan kod modifikasyonu olan (iş yapar

// determine if in dev environment 
if (($this->container->getParameter('kernel.environment') == 'dev')) 
{ 

    // Get array of all routes that are not built in 
    // (i.e You have added them yourself in a routing.yml file). 
    // Then get the current route, and check if it exists in the array 
    $myAppName = 'Acme'; 
    $routes = $this->getAllNonInternalRoutes($myAppName); 
    $currentRoute = $event->getRequest()->get('_route'); 
    if(!in_array($currentRoute, $routes)) 
    return; 
} 

// If still here, success, you have ignored the assetic and 
// web profiler actions, and any other actions that you did not add 
// yourself in a routing.yml file! Go ahead and redirect! 
$url = $this->container->get('router')->generate('change_password_route'); 
$response = new RedirectResponse($url); 
$event->setResponse($response); 

Ve çılgın kesmek işlevi getAllNonInternalRoutes()

İlgili konular