2016-12-16 27 views
-1

如何檢索我的控制器中通過@ParamConverter聲明爲註釋的所有3個實體(Departement,Category,Advert)直接到我的服務中?如何檢索ParamConverter到服務

我嘗試了很多東西,但沒有正常工作...

謝謝!

控制器

/** 
    * @Template("frontend/advertisement/show.html.twig") 
    * @ParamConverter("department", options={"mapping": {"slug_department": "department_slug"}}) 
    * @ParamConverter("category", options={"mapping": {"slug_category": "slug_fr"}}) 
    * @ParamConverter("advert", options={"mapping": {"slug_advert": "slug"}}) 
    * @Route(
    *  "/{_locale}/annonces/{slug_department}/{slug_category}/{slug_advert}", 
    *  name="advertShow", 
    *  requirements={ 
    *   "_locale": "en|fr" 
    *  } 
    *) */ 
    public function showAction(Request $request, Department $department , Category $category , Advert $advert ) 
    { 
     return [ 
      "advert"=>$advert 
     ]; 
    } 

Service.yml

app.breadcrumb: 
     class:  AppBundle\Service\Breadcrumb 
     arguments: ['@router'] 
     tags: 
      - { name: twig.extension } 
      - { name: request.param_converter, priority: 20 } 

Service.php

namespace AppBundle\Service; 

use Symfony\Bundle\FrameworkBundle\Routing\Router; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; 
use Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter\ParamConverterInterface; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\RequestStack; 

class Breadcrumb extends \Twig_Extension implements ParamConverterInterface 
{ 

    protected $router; 

    public function __construct(Router $route) 
    { 
     $this->router = $router; 
    } 

    public function generate($path) 
     { 

     return ["Home", "Item 1 ", "Item 2"]; 
     } 

    public function getFunctions() 
    { 
     return array(
      'breadcrumb' => new \Twig_Function_Method($this, 'generate') 
     ); 
    } 

    function supports(ParamConverter $configuration) 
    { 

    } 

    function apply(Request $request, ParamConverter $configuration) 
    { 
    } 

    public function getName() 
    { 
     return 'Breadcrumb'; 
    } 

} 
+0

您是否已經實施了參數轉換器並正在運行?你是否需要在控制器或'Breadcrumb'類中由param轉換器創建的對象? – Stepashka

回答

-1

的整個首先我建議實行3噸轉爐和他們分開枝條延伸。這對一個班級來說太過分了。

二。將您的服務作爲事件偵聽器訂閱到內核控制器事件。在此階段,請求中包含您需要的所有數據$event->getRequest()->attributes

+0

I Stepashka!你的解決方案看起來正常。非常感謝 –

+0

如果您需要更多代碼示例 - 請告訴我。我不確定這是你想要的,所以把答案縮短了。 – Stepashka

+0

無論誰放置-1,請解釋原因。 – Stepashka

0

這裏是我的願景如何完成(未經測試!)

首先,你應該返回你的控制器在關聯數組中的所有實體。

之後,您應該在您的服務中實施Symfony\Component\EventDispatcher\EventSubscriberInterface。因此,它看起來像這樣:

Service.php

namespace AppBundle\Service; 

use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
// .. other imports 

class Breadcrumb extends \Twig_Extension implements ParamConverterInterface, EventSubscriberInterface 
{ 
    private $entities = array(); 
    // .. other fields .. 

    public static function getSubscribedEvents() 
    { 
     return array(
      KernelEvents::VIEW => 'onKernelView', 
     ); 
    } 

    public function onKernelView(GetResponseForControllerResultEvent $event) 
    { 
     $view = $event->getControllerResult(); 
     if (is_array($view) && array_key_exists('entities', $view)) { 
      $this->entities = $view; 
     } 
    } 

    // .. other methods .. 
} 

Service.yml

app.breadcrumb: 
    class:  AppBundle\Service\Breadcrumb 
    arguments: ['@router'] 
    tags: 
     - { name: twig.extension } 
     - { name: request.param_converter, priority: 20 } 
     - { name: kernel.event_listener, event: kernel.view, method: onKernelView, priority: 101 }