Александр Макаров / Yii core team
https://slides.rmcreative.ru/2020/yii3/
class MiddlewareDispatcherFactory
{
public function __invoke(ContainerInterface $container)
{
$session = $container->get(SessionMiddleware::class);
$router = $container->get(Router::class);
$errorCatcher = $container->get(ErrorCatcher::class);
$subFolder = $container->get(SubFolder::class);
return new MiddlewareDispatcher([
$errorCatcher,
$session,
$subFolder,
$router,
], $container);
}
}
class RespondingMiddleware implements MiddlewareInterface
{
private $responseFactory;
public function __construct(ResponseFactoryInterface $responseFactory)
{
$this->responseFactory = $responseFactory;
}
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
$response = $this->responseFactory->createResponse();
$response->getBody()->write('Hello!');
return $response;
}
}
class ProcessingMiddleware implements MiddlewareInterface
{
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
// before other middleware
$response = $handler->handle($request);
// after other middleware
return $response;
}
}
class AppRouterFactory
{
public function __invoke(ContainerInterface $container)
{
$routes = [
Group::create('/user', [
Route::get('[/page-{page:\d+}]', [UserController::class, 'index'])
->name('user/index'),
Route::get('/{login}', [UserController::class, 'profile'])
->name('user/profile'),
]),
];
return (new RouterFactory(new FastRouteFactory(), $routes))($container);
}
}
class PostCard extends Widget
{
private UrlGeneratorInterface $urlGenerator;
public function __construct(UrlGeneratorInterface $urlGenerator)
{
$this->urlGenerator = $urlGenerator;
}
public function index(ArchiveRepository $archiveRepo): Response
{
return $this->render('index', [
'archive' => $archiveRepo->getFullArchive()
]);
}
Yii::$app
.