Php Zend中的主机名路由
Zend Expressive有一个用于Aura的适配器。路由器、FastRoute和Zend mvc路由器,路由可以轻松匹配方法和路径:Php Zend中的主机名路由,php,zend-framework,symfony-routing,zend-router,mezzio,Php,Zend Framework,Symfony Routing,Zend Router,Mezzio,Zend Expressive有一个用于Aura的适配器。路由器、FastRoute和Zend mvc路由器,路由可以轻松匹配方法和路径: <?php $app->get('/foo', $middleware); 提前谢谢 为什么不创建一个新的中间件来提取请求,并选择下一步在管道中调用哪个中间件 你可以这样做: 应用程序\中间件\决策中间件 <?php namespace Application\Middleware; use Psr\Http\Message\Resp
<?php
$app->get('/foo', $middleware);
提前谢谢 为什么不创建一个新的中间件来提取请求,并选择下一步在管道中调用哪个中间件 你可以这样做: 应用程序\中间件\决策中间件
<?php
namespace Application\Middleware;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
class DeciderMiddleware
{
protected $apiMiddleware;
protected $webMiddleware;
public function __construct(
callable $apiMiddleware,
callable $webMiddleware
) {
$this->apiMiddleware = $apiMiddleware;
$this->webMiddleware = $webMiddleware;
}
public function __invoke(
ServerRequestInterface $request,
ResponseInterface $response,
callable $next = null
) {
if (strpos($request->getUri()->getHost(), 'api.') === 0) {
return ($this->apiMiddleware)($request, $response);
}
if (strpos($request->getUri()->getHost(), 'www.') === 0) {
return ($this->webMiddleware)($request, $response);
}
return $next($request, $response);
}
}
我认为任何路由器都不支持这一点。您可以为Symfony路由器组件编写自己的网桥。它有一些很好的特性,其他的都没有
<?php
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
$route = new Route(
'/foo', // path
array('_controller' => 'SomeController'), // default values
array('subdomain' => 'api'), // requirements
array(), // options
'{subdomain}.example.com', // host
array(), // schemes
array() // methods
);
$routes = new RouteCollection();
$routes->add('foo', $route);
// dispatch the requiest to ApiMiddleware
$app->get(':subdomain.example.com/foo', $ApiMiddleware, ['subdomain' => 'api']);
// dispatch the requiest to WebMiddleware
$app->get(':subdomain.example.com/foo', $WebMiddleware, ['subdomain' => 'www']);
<?php
namespace Application\Middleware;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
class DeciderMiddleware
{
protected $apiMiddleware;
protected $webMiddleware;
public function __construct(
callable $apiMiddleware,
callable $webMiddleware
) {
$this->apiMiddleware = $apiMiddleware;
$this->webMiddleware = $webMiddleware;
}
public function __invoke(
ServerRequestInterface $request,
ResponseInterface $response,
callable $next = null
) {
if (strpos($request->getUri()->getHost(), 'api.') === 0) {
return ($this->apiMiddleware)($request, $response);
}
if (strpos($request->getUri()->getHost(), 'www.') === 0) {
return ($this->webMiddleware)($request, $response);
}
return $next($request, $response);
}
}
<?php
return [
'dependencies' => [
'factories' => [
Application\Middleware\DeciderMiddleware::class => Application\Middleware\DeciderMiddlewareFactory::class
],
],
'middleware_pipeline' => [
'always' => [
'middleware' => [
Application\Middleware\DeciderMiddleware::class
],
'priority' => 10000,
],
],
];