Mapowanie zapytania po nazwie hosta lub subdomeny w Zend Framework 3

W Zend Framework 3 można zmapować zapytanie do kontrolera w oparciu o nazwę hosta lub subdomeny za pomocą modułu Zend\Router\Http\Hostname. Poniżej przedstawiam prosty przykład:

  1. Dodaj moduł routingu Zend\Router do pliku konfiguracyjnego aplikacji config/application.config.php.
				
					'modules' => [
    'Zend\Router',
    'Application',
],

				
			
  1. Utwórz plik konfiguracyjny routingu module.config.php w katalogu modułu, np. module/Application/config/module.config.php.
				
					use Zend\Router\Http\Hostname;
use Zend\Router\Http\Literal;
use Zend\Router\Http\Segment;

return [
    'router' => [
        'routes' => [
            'home' => [
                'type' => Literal::class,
                'options' => [
                    'route'    => '/',
                    'defaults' => [
                        'controller' => 'Application\Controller\Index',
                        'action'     => 'index',
                    ],
                ],
            ],
            'api' => [
                'type' => Hostname::class,
                'options' => [
                    'route' => 'api.example.com',
                ],
                'may_terminate' => false,
                'child_routes' => [
                    'resource' => [
                        'type' => Segment::class,
                        'options' => [
                            'route' => '/resource[/:id]',
                            'defaults' => [
                                'controller' => 'Application\Controller\Api',
                                'action'     => 'resource',
                            ],
                            'constraints' => [
                                'id' => '[0-9]+',
                            ],
                        ],
                    ],
                ],
            ],
        ],
    ],
];

				
			

W tym przykładzie zostanie skonfigurowany routing dla hosta api.example.com i zmapowany do kontrolera Application\Controller\Api oraz akcji resourceAction, która obsługuje zasób o identyfikatorze id.

  1. Dodaj kontroler Application\Controller\Api z akcją resourceAction.
				
					namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\JsonModel;

class ApiController extends AbstractActionController
{
    public function resourceAction()
    {
        $id = $this->params()->fromRoute('id');
        $data = [
            'id' => $id,
            'name' => 'Resource ' . $id,
        ];
        return new JsonModel($data);
    }
}

				
			
  1. Dodaj wpis w pliku hosts, który odwzoruje nazwę hosta api.example.com na adres IP, na którym działa aplikacja.
				
					127.0.0.1 api.example.com

				
			
  1. Przejdź na stronę http://api.example.com/resource/1, aby zobaczyć działanie routingu. Powinna zostać zwrócona odpowiedź JSON z danymi zasobu o identyfikatorze 1.
				
					{
    "id": "1",
    "name": "Resource 1"
}

				
			

Podobnie można skonfigurować routing dla innych nazw hostów lub subdomen, zmieniając wartość opcji route w konfiguracji Hostname.