Код контроллера Symfony - PullRequest
0 голосов
/ 23 мая 2018

Привет, я только начал проект с Symfony и думаю, что делаю что-то не так.Прямо сейчас я хочу создать простую страницу с таблицей и фильтрами, поэтому я создал для нее контроллер.

/**
 * @Route("/")
 */
class HomeController extends Controller {

    public function index(Request $request) {
        //Form to add new documents
        $form = $this->newForm();
        $form->handleRequest($request);

        $user = $this->getDoctrine()->getRepository(User::class)->find($this->getUser());
        //Gets all user documents
        $files = $user->getDocuments();
        //Gets all categories
        $categories = $this->getDoctrine()->getRepository(Category::class)->findAll();

        //Adds new document to database
        if($form->isSubmitted() && $form->isValid()) {
            $article = $form->getData();
            $article->setUser($this->getUser());
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($article);
            $entityManager->flush();
            return $this->redirectToRoute('index');
        }

        return $this->render('home/home.html.twig', [
            'files' => $files,
            'categories' => $categories,
            'form' => $form->createView(),
        ]);
    }
}

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

/**
 * @Route("/{categoryId}")
 */
public function categories(request $request, $categoryId)
    {
        $form = $this->newForm();
        $form->handleRequest($request);

        $user = $this->getDoctrine()->getRepository(User::class)->find($this->getUser());
        $categories = $this->getDoctrine()->getRepository(Category::class)->findAll();

        $category = $this->getDoctrine()->getRepository(Category::class)->findOneBy(["id" => $categoryId]);
        $categoryFiles = $this->getDoctrine()->getRepository(Document::class)->categoryFiles($category, $user);

        if($form->isSubmitted() && $form->isValid()) {
            $article = $form->getData();
            $article->setUser($this->getUser());
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($article);
            $entityManager->flush();
            return $this->redirectToRoute('index');
        }

        return $this->render('home/home.html.twig', [
            'files' => $categoryFiles,
            'categories' => $categories,
            'form' => $form->createView(),
        ]);
    }

Все работает, но мне приходится повторять один и тот же код для категорий и форм во всех моих функциях.Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Я предлагаю вам использовать сервисы , Сервис может быть (Бизнес-правила, Помощники, Микросервисы и т. Д.), Наиболее важным является Бизнес-правила , обычно должна существовать службапо сущности

$user = $this->getUser();
$info = $this->get(HomeService::class)->getInfo($user, null);
// TODO FORM

return $this->render('home/home.html.twig', [
    'files' => $info['files'],
    'categories' => $info['categories'],
    'form' => $form->createView()

]);

Второе действие

$user = $this->getUser();
$info = $this->get(HomeService::class)->getInfo($user, $categoryId);
// TODO FORM

return $this->render('home/home.html.twig', [
    'files' => $info['category_files'],
    'categories' => $info['categories'],
    'form' => $form->createView()

]);

HomeService-> info (), будет обрабатыватьсявсе

Symfony Service

0 голосов
/ 23 мая 2018

Создайте абстрактный класс, а затем расширяйте его от дочерних контроллеров.Вы также можете прочитать: http://php.net/manual/en/language.oop5.late-static-bindings.php

Это просто в одну сторону, может быть больше способов!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...