我正在使用symfony 5. 4,我有一个控制器,管理多个路由并返回一个视图。
现在我想创建另一个控制器,它在所有页面中具有完全相同的逻辑,但返回另一个视图。下面是我实际拥有的一个示例:
class KioskController extends AbstractController
{
public function manualRegistration(
ManagerRegistry $doctrine,
Request $request,
Session $session,
LoggerInterface $logger,
MyWebservice $myWebservice,
AppointmentService $appointmentService)
{
/*
* page logic i want to re-use in another in another controller
*/
return $this->render('path/to/view.html.twig', ['form' => $form->createView(),'myVar'=>$var1, 'myArray'=>$arr]);
}
// other routes
}
我最初的想法是创建一个抽象类,它将扩展AbstractController
,并返回一个数组,其中包含将在视图中使用的所有元素(窗体和其他变量/数组),如下所示:
abstract class AbstractKioskManager extends AbstractController
{
protected function manageManualRegistration(
ManagerRegistry $doctrine,
Request $request,
Session $session,
LoggerInterface $logger,
MyWebservice $myWebservice,
AppointmentService $appointmentService)
{
/*
* page logic i want to re-use in another in another controller
*/
return ['form' => $form->createView(),'myVar'=>$var1, 'myArray'=>$arr])
}
}
然后将该抽象控制器用于将显示不同视图的2个或更多个控制器:
class KioskController1 extends AbstractKioskManager
{
public function manualRegistration(
ManagerRegistry $doctrine,
Request $request,
Session $session,
LoggerInterface $logger,
MyWebservice $myWebservice,
AppointmentService $appointmentService)
{
$viewParams = $this->manageManualRegistration($doctrine,$request,$session,$logger,$myWebservice,$appointmentService);
return $this->render('path/to/view1.html.twig',$viewParams);
}
// other routes
}
class KioskController2 extends AbstractKioskManager
{
public function manualRegistration(
ManagerRegistry $doctrine,
Request $request,
Session $session,
LoggerInterface $logger,
MyWebservice $myWebservice,
AppointmentService $appointmentService)
{
$viewParams = $this->manageManualRegistration($doctrine,$request,$session,$logger,$myWebservice,$appointmentService);
return $this->render('path/to/view2.html.twig',$viewParams);
}
// other routes
}
有没有更干净的方法?
1条答案
按热度按时间ki1q1bka1#
有没有更干净的方法?
是。使用Services
然后,您只需注入它,就可以在所有您想要的控制器中重用您的逻辑,如下所示: