1

Zend Экспрессивна предлагает следующее: адаптеры для Aura.Router, FastRoute и Зенд-маршрутизатор и MVC маршрут может соответствовать методу, и путь легко:Имя хоста маршрутизации в Zend Выразительные

<?php 
$app->get('/foo', $middleware); 

С zend-mvc Router компонент можно соответствует имени хоста:

<?php 
use Zend\Mvc\Router\Http\Hostname; 

$route = Hostname::factory([ 
    'route' => ':subdomain.example.com/foo', 
    'constraints' => [ 
     'subdomain' => 'api', 
    ], 
]); 

$router->addRoute('foo', $route); 

Это также возможно с Symfony Routing Component:

<?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']); 

Заранее спасибо!

+1

Я не думаю, что любой из маршрутизаторов поддерживает это. Что вы можете сделать, это написать собственный мост для компонента Symfony Router. У этого есть некоторые приятные особенности, которые другие отсутствуют. – xtreamwayz

+0

Существует [PR] (https://github.com/zendframework/zend-expressive/pull/370]) для маршрутизации имени хоста – venca

ответ

2

Почему вы не создали новое промежуточное программное обеспечение для извлечения запроса и не выбрали, какое промежуточное программное обеспечение следует вызывать в следующем конвейере?

Вы могли бы сделать что-то вроде этого:

Application \ Middleware \ DeciderMiddleware

<?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); 
    } 
} 

конфигурации/автозагрузка/промежуточного слоя-pipeline.global.php

<?php 

return [ 
    'dependencies' => [ 
     'factories' => [ 
      Application\Middleware\DeciderMiddleware::class => Application\Middleware\DeciderMiddlewareFactory::class 
     ], 
    ], 
    'middleware_pipeline' => [ 
     'always' => [ 
      'middleware' => [ 
       Application\Middleware\DeciderMiddleware::class 
      ], 
      'priority' => 10000, 
     ], 
    ], 
]; 

Единственное, что вам нужно для этого нужно определить apiMiddleware и webMiddleware в DeciderMiddlewareFactory и инициализировать объект DeciderMiddleware с этими параметрами.

 Смежные вопросы

  • Нет связанных вопросов^_^