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:
- Dodaj moduł routingu
Zend\Routerdo pliku konfiguracyjnego aplikacjiconfig/application.config.php.
'modules' => [
'Zend\Router',
'Application',
],
- Utwórz plik konfiguracyjny routingu
module.config.phpw 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.
- Dodaj kontroler
Application\Controller\Apiz 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);
}
}
- Dodaj wpis w pliku hosts, który odwzoruje nazwę hosta
api.example.comna adres IP, na którym działa aplikacja.
127.0.0.1 api.example.com
- 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.