당신은 그래서 MyMiddleware
가 \App\Path\To\My\Middleware
주입했을젠드 표현 의존성 주입
namespace App\Somnething;
use Interop\Container\ContainerInterface;
class MyMiddlewareFactory
{
public function __invoke(ContainerInterface $container, $requestedName)
{
return new $requestedName(
$container->get(\App\Path\To\My\Middleware::class)
);
}
}
같은 공장을 사용해야 미들웨어의 다른 미들웨어/객체를 갖고 싶어하고 우리는 그것을 액세스 할 수있을 것입니다 경우 .
질문 : 미들웨어에 응용 프로그램 자체 또는 컨테이너를 주입하는 것이 좋지 않습니까? Like :
namespace App\Somnething;
use Interop\Container\ContainerInterface;
use Zend\Expressive\Application;
class MyMiddlewareFactory
{
public function __invoke(ContainerInterface $container, $requestedName)
{
return new $requestedName(
$container->get(Application::class)
);
}
}
이렇게하면 비행 중에도 아무 것도 얻을 수 없습니다. Like
namespace App\Somnething;
use Zend\Expressive\Application;
class MyMiddleware
{
/** @var Application $app */
protected $app;
public function __construct(Application $app)
{
$this->app = $app;
}
public function __invoke($some, $thing)
{
if ($some and $thing) {
$ever = $this->app
->getContainer()
->get(\Path\To\What\Ever::class);
$ever->doSome();
}
}
}
'MiddlewareInterface'에 의해 액션 미들웨어를 구현하는 것이 더 좋을 것이고'return in_array ('MiddlewareInterface', class_implements ($ requestedName), true);가''can check '! – cottton
그럴 수도 있습니다. 그러나 내가 아는 한 Reflection을 사용하는 것은 매우 비쌉니다. 자동으로 모든 미들웨어를 초기화하고 싶지는 않습니다. 요청 당 1 액션 클래스 만 있으면 충분합니다. – xtreamwayz