1

Zend Expressive hat eine Adapter für Aura.Router, fastroute und zend-mvc Router und die Route des Verfahrens und der Weg leicht mithalten können:Host-Name-Routing in Zend Expressive

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

Mit zend-mvc Router Komponente ist es möglich, entsprechen den Hostnamen:

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

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

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

Dies auch mit Symfony Routing Component möglich ist:

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

So würde Ich mag der Lage sein, etwas ähnliches mit Expressive zu tun, und die Anforderung an eine andere Middleware versenden je nach Sub-Domain:

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

Vielen Dank im Voraus!

+1

Ich glaube nicht, dass einer der Router das unterstützt. Sie könnten Ihre eigene Bridge für die Symfony Router-Komponente schreiben. Es hat einige nette Eigenschaften, die die anderen fehlen. – xtreamwayz

+0

Es gibt [PR] (https://github.com/zendframework/zend-expressive/pull/370]) für das Routing des Hostnamens – venca

Antwort

2

Warum haben Sie keine neue Middleware zum Extrahieren der Anfrage erstellt und wählen Sie, welche Middleware als nächstes in der Pipeline aufgerufen werden soll?

Sie so etwas tun könnte:

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

config/autoload/Middleware-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, 
     ], 
    ], 
]; 

Das einzige, was Sie haben Zu tun ist, die apiMiddleware und die webMiddleware in der DeciderMiddlewareFactory zu definieren und das DeciderMiddleware-Objekt mit diesen Parametern zu initialisieren.

Verwandte Themen