2017-07-14 6 views
1

Symfony 3.4を使用しています。親抽象クラスですべての機能を維持したい、とちょうどお子様のルートプレフィックスを設定します。注釈ルーティングで親メソッドを継承する方法は?

namespace AppBundle\Controller; 

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 

abstract class TaskAbstractController extends Controller 
{ 

    /** 
    * Lists all Task entities. 
    * 
    * @Route("/", name="tasks_index") 
    * @Method("GET") 
    */ 
    public function indexAction() 
    { 
     $em = $this->getDoctrine()->getManager(); 

     $tasks = $em->getRepository($this->getTargetClassName())->findAll(); 
     return $this->render('@App/' . $this->getPrefix() . '/index.html.twig', array(
      'tasks' => $tasks, 
      'delete_forms' => $this->generateDeleteFormsViews($tasks) 
     )); 
    } 

子:

/** 
* Daily task controller. 
* 
* @Route("daily_tasks") 
*/ 
class DailyTaskController extends TaskAbstractController 
{ 

    protected function getPrefix(): string 
    { 
     return 'daily_task'; 
    } 

    protected function getTargetClassName(): string 
    { 
     return 'AppBundle:DailyTask'; 
    } 
} 

しかし、私は「GET/daily_tasks/『』が見つかりませルート」を取得していません。どうしたの?私のアイデアを実装する方法は?すべての子コントローラの注釈を使ってすべてのアクションを複製したくない。

答えて

1

OK、私は上に行くためだけに、この一例を持っているので、これはあなたが達成しようとしているかのようになります。

class TaskAbstractController extends Controller 
{ 
    /** 
    * Lists all Task entities. 
    * 
    * @Route("/{prefix}", name="tasks_index", requirements={"prefix":"daily_task|add_some_more"}) 
    * @Method("GET") 
    */ 
    public function indexAction($prefix) 
    { 
     $em = $this->getDoctrine()->getManager(); 

     /** @var TaskFactory $taskFactory */ 
     $taskFactory = $this->container->get('task_factory'); 
     $task  = $taskFactory->get($prefix); 

     $tasks = $em->getRepository($task->getTargetClassName())->findAll(); 

     return $this->render('@App/'.$prefix.'/index.html.twig', 
      [ 
       'tasks'  => $tasks, 
       'delete_forms' => $this->generateDeleteFormsViews($tasks), 
      ]); 
    } 
} 

class TaskFactory 
{ 
    public function get(string $prefix): TaskInterface 
    { 
     $map = [ 
      'daily_task' => DailyTask::class, 
     ]; 

     if (isset($map[$prefix])) { 
      return new $map[$prefix]; 
     } 

     throw new \RuntimeException('task not found'); 
    } 
} 

interface TaskInterface 
{ 
    public function getTargetClassName(): string; 
} 

を動的にルートを作成し、要件など、すべての可能な値を定義します。とにかく@Route()のアプローチで同様のことをしなければなりませんでした。

TaskFactoryは、その$prefixに基づいて、子供がどうなるかを決定します。

+0

本当にうまくいきます!あなたの時間を過ごしてくれてありがとう。 – Audiophile

関連する問題