@tvsjke
информация засекречена

Как правильно объединить два роута?

Есть два роута:

/**
   * @Route("/create", name="create")
   */
  public function createAction(Request $request) {
    $post = new Post();

    $form = $this->createForm(PostType::class, $post);

    if ($request->isMethod($request::METHOD_POST)) {
      $form->handleRequest($request);

      if ($form->isSubmitted() && $form->isValid()) {
        /** @var Symfony\Component\HttpFoundation\File\UploadedFile $file */
        $file = $post->getImage();
        $fileName = md5(uniqid()).'.'.$file->guessExtension();

        $file->move($this->getParameter('images_directory'), $fileName);

        $post->setImage($fileName);

        $em = $this->getDoctrine()->getManager();
        $em->persist($post);
        $em->flush();

        return $this->redirect($this->generateUrl('home'));
      }
    }

    return $this->render('ImagenariumBundle:Post:create.html.twig', ['form' => $form->createView(),]);
  }


и

/**
   * @Route("/{id}/edit", requirements={"id": "[1-9]\d*"}, name="edit")
   */
  public function editAction(Request $request, Post $post) {
    $form = $this->createForm(PostType::class, $post);

    if ($request->isMethod($request::METHOD_POST)) {
      $form->handleRequest($request);

      if ($form->isSubmitted() && $form->isValid()) {
        /** @var Symfony\Component\HttpFoundation\File\UploadedFile $file */
        $file = $post->getImage();
        $fileName = md5(uniqid()).'.'.$file->guessExtension();

        $file->move($this->getParameter('images_directory'), $fileName);

        $post->setImage($fileName);

        $em = $this->getDoctrine()->getManager();
        $em->persist($post);
        $em->flush();

        return $this->redirect($this->generateUrl('home'));
      }
    }

    return $this->render('ImagenariumBundle:Post:edit.html.twig', ['form' => $form->createView(),]);
  }


По сути, у них отличаются только две строчки. Как написать их красиво (я только начал с Symfony)? Пока кроме switch по имени роута ничего в голову не приходит.
  • Вопрос задан
  • 221 просмотр
Решения вопроса 1
Austin_Powers
@Austin_Powers
Web developer (Symfony, Go, Vue.js)
Не вижу ничего плохого в разных экшенах для создания и редактирваония сущности, но если очень надо то попробуйте использовать дефолтное значение в роутинге:
@Route("/{id}/edit", requirements={"id": "[1-9]\d*"}, name="edit", defaults={"id": 0})

И в экшене проверять, если пост не найден, то создавать новый.

Примечания по коду:
1) Сохранение файла на сервер стоит вынести в отдельный сервис.
2) $em->persist($post);в случае редактирования не требуется.
3) $form->isSubmitted() можно убрать, т.к. проверяется внутри $form->isValid()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@jaxel
Вам нужно не роуты объединять, а вынести логику из контроллеров.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы