2016-07-25 8 views
0

저는 현재 젠드 익스프레션을 배우고 있으며 루트/액션 내에서 미들웨어에 액세스하는 방법에 대한 몇 가지 옵션을 볼 수 있습니다.젠드 익스프레션 - 미들웨어 주입을위한 가장 좋은 방법

표현형 스켈레톤 애플리케이션에는 컨테이너가 삽입 된 HomePageFactory가 있으며, 라우터, 템플릿 엔진 등이 컨테이너에서 가져오고 새로운 HomePageAction 클래스가이를 사용하여 생성되어 반환됩니다. 예를 들어

는 :

class HomePageFactory 
{ 
    public function __invoke(ContainerInterface $container) 
    { 
     $router = $container->get(RouterInterface::class); 
     $template = ($container->has(TemplateRendererInterface::class)) 
      ? $container->get(TemplateRendererInterface::class) 
      : null; 

     return new HomePageAction($router, $template); 
    } 

나는 다음 플래시 메신저를 필요로하고 다음 건너 온 :

class SlimFlashMiddlewareFactory 
{ 
    public function __invoke($container) 
    { 
     return function ($request, $response, $next) { 
      // Start the session whenever we use this! 
      session_start(); 

      return $next(
       $request->withAttribute('flash', new Messages()), 
       $response 
      ); 
     }; 
    } 
} 

그래서이 약간 다릅니다 및 속성을 통해 요청에 미들웨어를 추가하고있다. 그 같은 필요한 경우 다음 검색 할 수있는 :

$flashMessenger = $request->getAttribute('flash'); 

그래서 정말 내 질문이 무엇인지 행동으로 FlashMessenger를 얻기의 이러한 두 가지 방법의 장점/단점은?

데이터베이스에서 사용자를 가져 오는 작업을 처리하는 UserService가있어 여러 작업/경로에 필요할 수있는 경우 HomeService & 팩토리 (및 필요한 다른 모든 사용자)를 수정하여 UserService ?

class HomePageFactory 
    { 
     public function __invoke(ContainerInterface $container) 
     { 
      $router = $container->get(RouterInterface::class); 
      $template = ($container->has(TemplateRendererInterface::class)) 
       ? $container->get(TemplateRendererInterface::class) 
       : null; 
      $userService = $container->get(App\UserService::class); 

      return new HomePageAction($router, $template, $userService); 
     } 

또는 나는 FlashMessenger가 (관리 좀 더 쉽게 보인다)의 작동 방식에 가서 그것을 필요 그런 식으로 액세스하는 속성을 통해 요청에 추가하는 것이 더 있을까?

$userService = $request->getAttribute('UserService'); 

후자의 옵션을 사용하여 성능 문제가 있는지 나는이 특정 경로가 아닌 UserServer되는 응용 프로그램 전체를이 방식으로 수행 될 수 있음을 이해한다하지만 내가 궁금하네요 .

내 질문에이 글을 쓰고 나면 진정한 미들웨어가 아니므로 실제로는 HomePageAction & 팩토리를 수정하고 UserService를 추가하는 것이 더 쉽고 사용하기 쉽도록하는 것입니다. 속성 ala FlashMessenger. 그러나 구루가이를 명확히하는 데 도움이된다면 매우 편리 할 것입니다.

미리 감사드립니다.

답변

1

테스트하지 않았기 때문에 성능 차이에 대해 알지 못합니다. 하지만 당신이 스스로에게 물어야 할 질문은 수업이 무엇을하는 것인가? Action 클래스를 호출하기 전후에 다른 미들웨어가 필요하거나, Action 클래스 또는 애플리케이션의 다른 곳에서만 필요로 하는가?

경우에 따라 UserService가 사용자 등록 또는 업데이트를 담당 할 수 있습니다. 그 물건은 당신의 직감이 당신에게 말하는 것처럼 ActionFactory로 주입 될 것입니다. 그러나 인증을 위해서는 미들웨어를 사용하는 경우와 다를 수 있습니다. 먼저 인증 미들웨어에 해당 클래스가 필요합니다.이 미들웨어는 요청과 함께 인증 미들웨어에 전달할 수 있습니다 (또는 인증 된 사용자 객체 만 전달할 수도 있습니다).

어림짐작에 따라 들어오는 요청 또는 나가는 응답을 동작 전/후에 변경해야하는 경우 요청을 전달하거나 그렇지 않으면 팩토리가있는 동작에 주입합니다.

요청으로 모든 것을 전달하기 시작하면 추적하기가 매우 어려울 것입니다. Action 클래스에 가능한 많은 정보를 주입하는 것이 훨씬 쉽다는 것을 알았습니다. 그 클래스 내에서 필요한 것이 무엇인지 쉽게 볼 수 있고 더 쉽게 테스트 할 수 있기 때문입니다.

플래시 메신저, 세션 및 요청에 삽입 한 인증 된 사용자와 같은 것들.

+0

답변 해 주셔서 감사합니다. 이 특정 UserService는 인증을 처리하지 않으므로 요청을 수정할 필요가 없습니다. 그래서 저는 그것을 행동으로 주입함으로써 올바른 방향으로 가고 있다고 생각합니다. 정신 건강 체크 및 설명에 감사드립니다. – Neddage