Symfony - где хранить пользовательские формы логи c? - PullRequest
0 голосов
/ 09 апреля 2020

Я хотел бы знать, где хранить какой-то пользовательский код, связанный с формой. Я пишу приложение Symfony, в котором пользователь может добавить свою категорию (используя форму, конечно). Когда пользователь добавляет свою категорию, код формы внутри контроллера проверяет, является ли эта форма отправленной и действительной. Если да, то в базу данных добавляются категория пользователя и URI, который создается на основе имени категории . Теперь весь этот код и логика c хранятся в CategoryController внутри addCategory () action. Точно так же:

public function addCategory(Request $request): Response
{
    // create the whole form inside CategoryType class
    $form = $this->createForm(CategoryType::class);

    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {

        $categories = $form->getData();
        $categories->setName(preg_replace(
            '#\s+#', ' ', $categories->getName()));

        $categories->setCategoryUri(strtolower(str_replace(
            ' ', '-', $categories->getName())));

        $this->getDoctrine()->getRepository(Categories::class)
            ->addOneCategory($categories);

        return $this->redirectToRoute('flashcard_index');
    }

    return $this->render('category/add_category.html.twig', [
        'form' => $form->createView(),
        'slug' => 'Add category'
    ]);
}

Как вы видите внутри оператора if, есть код, о котором я пишу. Сначала пользовательские данные сохраняются в переменную $categories, затем я удаляю более одного пробела, используя preg_replace() (если пользователь вводит более одного пробела в поле формы), и, наконец, я создаю URI на основе имени категории, используя * Функции 1012 * и str_replace().

Проблема в том, что я не знаю, является ли хорошей практикой хранение вышеупомянутой логики c внутри действия контроллера, а если нет, где хранить эти логики c ? Не могли бы вы ответить мне на этот вопрос? Заранее благодарю за все ответы!

1 Ответ

1 голос
/ 09 апреля 2020

Тогда лучшее место для хранения логи c находится вне вашего контроллера, как вы сказали. Вопрос, который вы должны задать: «Как я могу проверить свой код более быстрым и простым способом?»

В отдельном классе. Не класс менеджера из тысячи строк, а только один класс AddCategorieHandler

Если вы хотите иметь несвязанный код, удалите data_class из вашего form. Если вы хотите получить данные из вашей формы, просто позвоните form->getData(), и у вас будет массив.

Тогда вы можете создать message с symfony мессенджером, Это сообщение будет связано с обработчиком AddCategorieHandler.

Бонус, компонент Messenger может вызвать doctrine для начала транзакции и flu sh для вас.

Итак .. В ваш контроллер, вам просто нужно создать сообщение, использовать Messenger для его отправки и вуаля.

И ваш AddCategorieHandler имеет все логи c, которые вы хотите, легко тестировать (не нужно издеваться Doctrine, или функциональный тест ..)

Если вы хотите удалить категорию, просто создайте DeleteCategoryHandler.

Это много классов, которые вы должны создать, но в большой проект в долгосрочной перспективе, вы будете рады провести 2000 тестов в 2secs всей вашей логики c!

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