2016-12-16 14 views
-1

私の3つのエンティティ(Departement、Category、Advert)を@ParamConverter経由で@ParamConverter経由で直接私のサービスに取り込むには?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

Service.yml

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.php

私は3つのコンバータを実装してからそれらを分離することをお勧めしたい:それはこのようになりますようにtwig拡張子。 1つのクラスではあまりにも多くなるでしょう。

秒。サービスをイベントリスナーとしてカーネルコントローライベントに登録します。この段階で、リクエストに必要なすべてのデータがあります$event->getRequest()->attributes

+0

I Stepashka!あなたのソリューションは適切に動作しているようです。多くのありがとう –

+0

もっとコード例が必要な場合はお知らせください。私はそれがあなたの望むものであると確信していなかったので、答えは短くなりました。 – Stepashka

+0

誰でも-1を書いてください理由を説明してください。 – Stepashka

0

これはどのように行うことができるかに関する私のビジョンです(テストされていません)

まず、コントローラからすべてのエンティティを関連付けられた配列に戻す必要があります。

その後、サービスにSymfony\Component\EventDispatcher\EventSubscriberInterfaceを実装する必要があります。全体の最初の

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 } 
関連する問題