Symfony معالجة منطق طلب النموذج

0

عذرًا إذا كان هذا السؤال فوضويًا للغاية ، ولكن هل هناك طريقة شائعة للتعامل مع طلب النموذج في Symfony؟ (أستخدم SF 4).

الآن ، لدي المنطق في وحدة التحكم الخاصة بي:

$formBooking = $this->createForm(BookingType::class);

    $formBooking->handleRequest($request);

    if ($formBooking->isSubmitted() && $formBooking->isValid()) {
        // perform actions ...

لدي العديد من النماذج في نفس الصفحة ، لذا فإن جهاز التحكم الخاص بي يصبح أكبر وأكبر.

كنت أرغب في إنشاء مجلد جديد مثل Action ووضع المنطقي هنا.

وتفعل في وحدة التحكم الخاصة بي:

 $formBooking = $this->createForm(BookingType::class);

 // $bookingAction = new App\Action\BookingAction
 $bookingAction->handleRequest($formBooking, $request);

أريد فقط أن أعرف ما إذا كانت هناك طريقة "رسمية" لذلك؟

1 إجابة

0

يمكنك إنشاء "BaseController" مجردة ، وترث وحدة التحكم الأخرى. لا أعتقد أن هذه طريقة "رسمية" ، لكنها تبدو مناسبة.

في المثال الخاص بي ، قمت بتعيين مدير الكيان الخاص بي ومصنع النماذج الخاص بي وتوجيهي كخدمات. أيضًا ، يطلق عليه BaseManager ، حيث أن كل منطقتي موجودة في ملف المدير ، في حين أن وحدة التحكم الخاصة بي لا تحتوي على رمز (نوع من الاتصال بمديري ، باستثناء حالات معينة)

للقيام بذلك ، ما عليك سوى الرجوع إلى الخدمة الخاصة بك ، وجعل وحدة التحكم الخاصة بك هي الرئيسية ، ولكنها نظيفة وبسيطة.

## Controller##
<?php
namespace AppBundle\Controller;
use AppBundle\Entity\Category;
use AppBundle\Form\CategoryType;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\Request;
/**
 * @Route("/admin/category")
 */
class CategoryController extends Controller
{
    /**
     * @Template()
     * @Route("/", name="category_index")
     * @return array
     */
    public function indexAction()
    {
        $categories = $this->get('app.category.manager')->find();
        return array('categories' => $categories);
    }
    /**
     * @Template()
     * @Route("/", name="category_menu")
     * @return array
     */
    public function menuAction()
    {
        $categories = $this->getDoctrine()->getRepository('AppBundle:Category')->findAllOrdered("ASC");
        return array('categories' => $categories);
    }
    /**
     * @Template()
     * @Route("/icones/glyficones", name="category_icones_glyficones")
     * @return array
     */
    public function fontawesomeAction()
    {
        return array();
    }
    /**
     * @Template()
     * @Route("/icones/fontawesome", name="category_icones_fontawesome")
     * @return array
     */
    public function glyficoneAction()
    {
        return array();
    }
    /**
     * @Template()
     * @Route("/new", name="category_create")
     * @param Request $request
     * @return array
     */
    public function newAction(Request $request)
    {
        return $this->get('app.category.manager')->save($request);
    }
    /**
     * @Template()
     * @Route("/{id}/edit", name="category_edit")
     * @param Request $request
     * @param $id
     * @return array
     */
    public function editAction(Request $request, $id)
    {
        return $this->get('app.category.manager')->edit($request, $id);
    }
    /**
     * @Template()
     * @Route("/{id}/delete", name="category_delete")
     * @param Request $request
     * @param $id
     * @return array
     */
    public function deleteAction(Request $request, $id)
    {
        return $this->get('app.category.manager')->delete($request, $id);
    }
}

مدير القاعدة

<?php
namespace AppBundle\Manager;
use AppBundle\Form\CategoryType;
use Symfony\Bundle\FrameworkBundle\Routing\Router;
use Symfony\Component\Form\Form;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
abstract class BaseManager
{
    protected $em;
    protected $formFactory;
    protected $router;
    /**
     * CategoryManager constructor.
     * @param $em
     * @param $formFactory
     * @param Router $router
     */
    public function __construct($em, $formFactory, Router $router)
    {
        $this->em = $em;
        $this->formFactory = $formFactory;
        $this->router = $router;
    }
    /**
     * @param $entity
     */
    protected function persistAndFlush($entity)
    {
        $this->em->persist($entity);
        $this->em->flush();
    }
    /**
     * @param $entity
     */
    protected function removeAndFlush($entity)
    {
        $this->em->remove($entity);
        $this->em->flush();
    }
    /**
     * @param Request $request
     * @param Form $form
     * @param $entity
     * @param $path
     * @return array|RedirectResponse
     */
    protected function handleBaseForm(Request $request, Form $form, $entity, $path)
    {
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $this->persistAndFlush($entity);
            return new RedirectResponse($this->router->generate($path));
        }
        return array('form' => $form->createView());
    }
    /**
     * @param $route
     * @return RedirectResponse
     */
    protected function redirect($route)
    {
        return new RedirectResponse($this->router->generate($route));
    }
}

وهنا مثال على ذلك ، عبارة بسيطة عن كيان "فئة".

مدير كيان محدد

<?php
namespace AppBundle\Manager;
use AppBundle\Entity\Category;
use AppBundle\Form\CategoryType;
use Symfony\Bundle\FrameworkBundle\Routing\Router;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
/**
 * Class CategoryManager
 * @package AppBundle\Manager
 */
class CategoryManager extends BaseManager
{
    /**
     * CategoryManager constructor.
     * @param $em
     * @param $formFactory
     * @param Router $router
     */
    public function __construct($em, $formFactory, Router $router)
    {
        parent::__construct($em, $formFactory, $router);
    }
    /**
     * @return mixed
     */
    public function find()
    {
        return $this->em->getRepository('AppBundle:Category')->findAll();
    }
    /**
     * @param Request $request
     * @return array
     */
    public function save(Request $request)
    {
        $category = new Category();
        return $this->handleForm($request, $category);
    }
    /**
     * @param Request $request
     * @param $id
     * @return array|RedirectResponse
     */
    public function edit(Request $request, $id)
    {
        $category = $this->em->getRepository('AppBundle:Category')->find($id);
        return $this->handleForm($request, $category);
    }
    /**
     * @param Request $request
     * @param $id
     * @return RedirectResponse
     */
    public function delete(Request $request, $id)
    {
        $category = $this->em->getRepository('AppBundle:Category')->find($id);
        $this->persistAndFlush($category);
        return $this->redirect('category_index');
    }
    /**
     * @param Request $request
     * @param Category $category
     * @return array|RedirectResponse
     */
    public function handleForm(Request $request, $category)
    {
        $form = $this->formFactory->create(CategoryType::class, $category);
        return $this->handleBaseForm($request, $form, $category, "category_index");
    }
}

إذا لزم الأمر ، فإليك ملف services.yaml الخاص بي

services:
  app.category.manager:
    class: AppBundle\Manager\CategoryManager
    arguments: [ '@doctrine.orm.entity_manager', '@form.factory', '@router' ]

  fos_user.doctrine_registry:
      alias: doctrine

آمل أن يساعد ذلك في حل مشكلتك ، والحصول على رمز أنظف. من فضلك ، لاحظ أن هذا حل شخصي ، وربما هناك حلول أفضل. لكن هذا واحد يعمل ، والذي يبدو لي ، أنظف من السماح لوحدة التحكم بكل المنطق

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام