2017-09-20 12 views
0

내가 젠드 표현 중첩 된 응용 프로그램을 사용하려고 해요, 그래서이 블로그 게시물을 다음 해요 : 문제는 미들웨어 공장 것 같다 https://framework.zend.com/blog/2017-03-15-nested-middleware-in-expressive.html젠드 표현 중첩 된 응용 프로그램

:

class CreateBookMiddlewareFactory 
{ 
    public function __invoke(ContainerInterface $container) 
    { 
     $nested = new Application(
      $container->get(RouterInterface::class), 
      $container 
     ); 

     $nested->pipe(AuthenticationMiddleware::class); 
     $nested->pipe(ContentValidationMiddleware::class); 
     $nested->pipe(BodyParamsMiddleware::class); 
     $nested->pipe(BookValidationMiddleware::class); 
     $nested->pipe(CreateBookMiddleware::class); 

     return $nested; 
    } 
} 

나는 우리가 그 공장에있는 것처럼 CreateBookMiddleware가 여기에 파이프에 추가 될 수있는 방법을 얻지 못한다. ... 또 다른 중첩 된 응용 프로그램을 만들 것입니다 공장을 호출하는 새로운 중첩 된 응용 프로그램을 만들고, 공장을 호출 배관 그래서

(!) Fatal error: Maximum function nesting level of '256' reached, aborting! in /var/www/project/vendor/zendframework/zend-stratigility/src/Next.php on line 
    158 

내가이 블로그 게시물에서 바로받지 못했습니다 뭔가가 있나요?

답변

2

공장 이름을 CreateBookMiddlewareFactory로 지정했습니다. 그리고 나서 __invoke 안에 $nested->pipe(CreateBookMiddleware::class);이 있습니다. 그것은 당신의 설정에 달려 있지만, 보통 CreateBookMiddlewareFactory는 CreateBookMiddleware의 공장이 될 것입니다. 그래서 루프를 계속해서 붙잡고 있기 때문에 루프에 갇혀 있습니다.

blogpost에서와 똑같은 코드를 사용하고 있기 때문에 블로그 게시물에 오류가 있다고 생각합니다. 마지막 위임자 팩토리 예제에서와 같아야한다고 생각합니다 : 마지막 $nested->pipe(CreateBookMiddleware::class);없이.

블로그 게시물의 작성자에게 통보했습니다.

편집 : 블로그 게시물이 수정과 함께 업데이트됩니다

namespace Acme\Api; 

use Acme\AuthenticationMiddleware; 
use Acme\ContentNegotiationMiddleware; 
use Psr\Container\ContainerInterface; 
use Zend\Expressive\Application; 
use Zend\Expressive\Helper\BodyParams\BodyParamsMiddleware; 
use Zend\Expressive\Router\RouterInterface; 

class CreateBookMiddlewareFactory 
{ 
    public function __invoke(ContainerInterface $container) 
    { 
     $nested = new Application(
      $container->get(RouterInterface::class), 
      $container 
     ); 

     $nested->pipe(AuthenticationMiddleware::class); 
     $nested->pipe(ContentValidationMiddleware::class); 
     $nested->pipe(BodyParamsMiddleware::class); 
     $nested->pipe(BookValidationMiddleware::class); 

     // If dependencies are needed, pull them from the container and pass 
     // them to the constructor: 
     $nested->pipe(new CreateBookMiddleware()); 

     return $nested; 
    } 
} 
0

내가 해명 @xtreamwayz 대답을 받아 들였다. 그러나 여기에 내가 그것을 작동하게하는 방법은 다음과 같습니다가 지금 포스트에 고정 정확히 방법

class CreateBookMiddlewareFactory 
{ 
    public function __invoke(ContainerInterface $container) 
    { 
     $nested = new Application(
      $container->get(RouterInterface::class), 
      $container 
     ); 

     $nested->pipe($container->get(AuthenticationMiddleware::class)); 
     $nested->pipe($container->get(ContentValidationMiddleware::class)); 
     $nested->pipe($container->get(BodyParamsMiddleware::class)); 
     $nested->pipe($container->get(BookValidationMiddleware::class)); 
     // instanciate the new class, so it will not call the factory again 
     $nested->pipe(new CreateBookMiddleware()); 

     return $nested; 
    } 
} 
+0

: https://github.com/zendframework/zf3-web/commit/2ae14d151e512b13506c4f854ad6a811d9a74af0 – xtreamwayz