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\Router
do pliku konfiguracyjnego aplikacjiconfig/application.config.php
.
'modules' => [
'Zend\Router',
'Application',
],
- 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
.
- 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);
}
}
- 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
- 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
.