Symfony控制器作为服务如何使用__invoke方法?

时间:2017-03-07 03:22:23

标签: service symfony

例如,在以下代码中:

/**
 * @Route("/patients", service="bundle1.controller.patient.index")
 */
final class IndexController
{
    private $router;
    private $formFactory;
    private $templating;
    private $patientFinder;

    public function __construct(RouterInterface $router, FormFactoryInterface $formFactory, EngineInterface $templating, PatientFinder $patientFinder)
    {
        $this->router = $router;
        $this->formFactory = $formFactory;
        $this->templating = $templating;
        $this->patientFinder = $patientFinder;
    }

    /**
     * @Route("", name="patients_index")
     */
    public function __invoke(Request $request) : Response
    {
        $form = $this->formFactory->create(PatientFilterType::class, null, [
            'action' => $this->router->generate('patients_index'),
            'method' => Request::METHOD_GET,
        ]);
        $form->handleRequest($request);
        $patients = $this->patientFinder->matching($form->getData() ?: []);

        return $this->templating->renderResponse('patient/index.html.twig', [
            'form' => $form->createView(),
            'patients' => $patients,
        ]);
    }
}

为什么__invoke的路径注释是空的? 这个控制器的生命周期是什么?我的意思是,Symfony何时创建对象,何时执行类以使用__invoke

1 个答案:

答案 0 :(得分:1)

@Route注释意味着在主要路线/patients之后没有任何内容。 __invoke是一种神奇的PHP方法,在您将类作为函数调用时执行(不提供任何方法)。 因此,当您点击路线__invoke或从任何代码调用服务时,都会执行/patients方法。