Symfony句柄表单请求逻辑

Symfony句柄表单请求逻辑,symfony,Symfony,很抱歉,如果这个问题太麻烦了,但是在Symfony中有处理表单请求的常用方法吗?(我使用SF4) 现在,我的控制器中有逻辑: $formBooking = $this->createForm(BookingType::class); $formBooking->handleRequest($request); if ($formBooking->isSubmitted() && $formBooking->isValid()) {

很抱歉,如果这个问题太麻烦了,但是在Symfony中有处理表单请求的常用方法吗?(我使用SF4)

现在,我的控制器中有逻辑:

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

    $formBooking->handleRequest($request);

    if ($formBooking->isSubmitted() && $formBooking->isValid()) {
        // perform actions ...
 $formBooking = $this->createForm(BookingType::class);

 // $bookingAction = new App\Action\BookingAction
 $bookingAction->handleRequest($formBooking, $request);
我在同一页上有几个表单,所以我的控制器越来越大

我想创建一个新文件夹,如Action,并将逻辑文件放在这里

在我的控制器中执行以下操作:

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

    $formBooking->handleRequest($request);

    if ($formBooking->isSubmitted() && $formBooking->isValid()) {
        // perform actions ...
 $formBooking = $this->createForm(BookingType::class);

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

我只是想知道是否有任何“官方”的方法来实现这一点?

您可以创建一个抽象的“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);
    }
}

希望它可以帮助解决您的问题,并得到一个更干净的代码。请注意,这是个人的解决方案,可能有更好的解决方案。但这是一个有效的方法,对我来说,这似乎比让控制器拥有所有逻辑更干净

您有两种方法来分割代码,首先根据业务逻辑创建多个控制器。第二个是转向服务您的业务逻辑,以保持顶层控制器。是的,我将转向操作,我不想与服务混合,因为操作仅用于表单句柄。对我来说,将控制器作为顶层更符合逻辑。请仔细考虑第一条评论。将每个控制器限制为一个操作将解决控制器失控的问题。并消除你提出的相当尴尬的预订操作分离。我想告诉你,为什么这种分离很尴尬?SymfonyDoc表示,最好使用相同的方法/控制器处理表单请求。创建一个新的控制器并将窗体的操作设置为此控制器是否更好?谢谢。您的第一个代码是处理表单的“标准”方式。标记为“/ /执行操作”的部分是您可能考虑移动到另一个服务的部分。假设它更复杂,那么只需持久化您的预订对象并重定向即可。服务应该不知道表单或请求。但同样,如果您的主要目标是减少控制器代码,那么每个控制器一个操作是一个简单的起点。
services:
  app.category.manager:
    class: AppBundle\Manager\CategoryManager
    arguments: [ '@doctrine.orm.entity_manager', '@form.factory', '@router' ]

  fos_user.doctrine_registry:
      alias: doctrine