Если вы хотите иметь другой промежуточный слой/объект в промежуточном программном вы должны использовать завод какZend Выразительный Dependency Injection
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)
);
}
}
Так MyMiddleware
бы вводили \App\Path\To\My\Middleware
, и мы могли бы получить к нему доступ ,
Вопрос: Неправильно ли вводить промежуточное программное обеспечение с самим приложением или контейнером? Вроде:
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)
);
}
}
Таким образом можно было бы получить что-нибудь ~ на лету. Как
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» и позволить ':: canCreate' проверять, если' return in_array ('MiddlewareInterface', class_implements ($ requestName), true); 'Спасибо btw! – cottton
Это также возможно. Однако, насколько мне известно, очень дорого использовать Reflection. Я не хочу, чтобы авто инициализировать все мое промежуточное ПО, для меня достаточно всего 1 класса действия за запрос. – xtreamwayz