Как я могу использовать один и тот же код в разных функциях Symfony Controller? - PullRequest
0 голосов
/ 04 марта 2019

В моем контроллере я использую несколько функций.В этой функции я использую аналогичный код.

Так что мне интересно, есть ли возможность передать этот код на аутсорсинг, чтобы не писать его повторно.Если это возможно, что будет лучшим способом сделать это?

class PagesController extends AbstractController
{
  /**
  * @Route("/documents/{slug}", name="documents", methods={"GET","POST"})
  */

  public function documents($slug,  Request $request)
  {
     $page = $this->getDoctrine()->getRepository(Pages::class)->findOneBy(['slug'=>$slug]);
     $entityManager = $this->getDoctrine()->getManager();
    $cmf = $entityManager->getMetadataFactory();
    $classes = $cmf->getMetadataFor($relation_name);
    $fieldMappings = $classes->fieldMappings;
    $associationMappings = $classes->associationMappings;
    $fields = (object)array_merge((array)$fieldMappings, (array)$associationMappings);
  }


  /**
  * @Route("/blog/{slug}", name="single", methods={"GET","POST"})
  */


  public function blog($slug,  Request $request)
  {
     $page = $this->getDoctrine()->getRepository(Pages::class)->findOneBy(['slug'=>$slug]);
     $entityManager = $this->getDoctrine()->getManager();
    $cmf = $entityManager->getMetadataFactory();
    $classes = $cmf->getMetadataFor($relation_name);
    $fieldMappings = $classes->fieldMappings;
    $associationMappings = $classes->associationMappings;
    $fields = (object)array_merge((array)$fieldMappings, (array)$associationMappings);
  }

  /**
  * @Route("/contact/{slug}", name="contact", methods={"POST", "GET"})
  */

  public function contact($slug,  Request $request)
  {
     $page = $this->getDoctrine()->getRepository(Pages::class)->findOneBy(['slug'=>$slug]);
     $entityManager = $this->getDoctrine()->getManager();
    $cmf = $entityManager->getMetadataFactory();
    $classes = $cmf->getMetadataFor($relation_name);
    $fieldMappings = $classes->fieldMappings;
    $associationMappings = $classes->associationMappings;
    $fields = (object)array_merge((array)$fieldMappings, (array)$associationMappings);
  }
}

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Ключевое слово здесь: services .Переместите свою бизнес-логику в другие классы и автоматически внедрите ее в свой контроллер, используя autowiring .Это Лучшая практика Symfony :

Symfony следует философии «тонких контроллеров и толстых моделей».Это означает, что контроллеры должны содержать только тонкий слой клейкого кода, необходимого для координации различных частей приложения.

Об этих рекомендациях следует прочитать!

Вы можете ввестиуслуги в вашем классе контроллера и в конкретном действии:

class PagesController extends AbstractController
{
  public function __construct(Rot13Transformer $transformer)
  {
    $this->transformer = $transformer;
  }

  /**
  * @Route("/documents/{slug}", name="documents", methods={"GET","POST"})
  */

  public function documents($slug,  Request $request, PagesRepository $repo)
  {
     $page = $repo->findOneBy(['slug'=>$slug]);

     $foo = $repo->doSomethingDifferentWithEntities($page)

     $bar = $this->transformer->transform($foo);
  }
}
0 голосов
/ 04 марта 2019

@ Jarla В дополнение к ответу @Stephan Vierkant вы можете использовать @ Аннотация ParamConverter В вашем случае это будет:

/**
  *  @Route("/documents/{slug}", name="documents", methods={"GET","POST"})
  *  @ParamConverter("page", options={"mapping": {"slug": "slug"}})
  */
 public function documents(Page $page,  Request $request)
  {
     $foo = $repo->doSomethingDifferentWithEntities($page)

     $bar = $this->transformer->transform($foo);
  }

0 голосов
/ 04 марта 2019

Вы можете использовать приватный метод и вызывать его, но в вашем случае вы можете использовать Page typehint прямо в параметре:

/**
 * @Route("/contact/{slug}", name="contact", methods={"POST", "GET"})
 */
 public function contact(Page $slug, Request $request)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...