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