symfony 对多个视图使用相同控制器代码

qxsslcnc  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(140)

我正在使用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

}

有没有更干净的方法?

ki1q1bka

ki1q1bka1#

有没有更干净的方法?
是。使用Services
然后,您只需注入它,就可以在所有您想要的控制器中重用您的逻辑,如下所示:

public function myFunction(Myservice $myService): Response
{
    $myService->doSomething();

    return $this->render('path/to/view1.html.twig');
}

相关问题