Zend Framework - Roteamento
Mapas de rotas Request URIpara um método de controlador específico. Neste capítulo, veremos como implementar as rotas em um Zend Framework.
Em geral, qualquer URI tem três partes -
- Segmento de nome de host,
- Segmento de caminho, e
- Segmento de consulta.
Por exemplo, em URI / URL - http://www.example.com/index?q=data, www.example.com é o segmento do nome do host, index é o segmento de caminho e q=dataé o segmento de consulta. Geralmente, o roteamento verifica oPage segmentcontra um conjunto de restrições. Se alguma restrição corresponder, ele retornará um conjunto de valores. Um dos principais valores é o controlador.
O roteamento também verifica o segmento de host, segmento de consulta, métodos de solicitação HTTP, cabeçalhos de solicitação HTTP, etc., em uma determinada situação.
Route & RouteStack
A rota é o principal objeto do roteamento. Zend Framework tem uma interface especial para objeto de rota,RouteInterface. Todos os objetos de rota precisam implementar RouteInterface. A lista completa de RouteInterface é a seguinte -
namespace Zend\Mvc\Router;
use Zend\Stdlib\RequestInterface as Request;
interface RouteInterface {
public static function factory(array $options = []); public function match(Request $request);
public function assemble(array $params = [], array $options = []);
}
O método principal é match. Este método de correspondência verifica a solicitação fornecida em relação à restrição definida nela. Se qualquer correspondência for encontrada, ele retorna oRouteMatchobjeto. Este objeto RouteMatch fornece os detalhes da solicitação correspondida como parâmetros. Esses parâmetros podem ser extraídos deRouteObject usando o getParams método.
A lista completa do RouteObject é a seguinte -
namespace Zend\Mvc\Router;
class RouteMatch {
public function __construct(array $params); public function setMatchedRouteName($name);
public function getMatchedRouteName();
public function setParam($name, $value);
public function getParams();
public function getParam($name, $default = null);
}
Em geral, um aplicativo MVC típico tem muitas rotas. Cada uma dessas rotas será processada em um pedido UEPS e uma única rota será combinada e devolvida. Se nenhuma rota for correspondida / retornada, o aplicativo retornará o erro “Página não encontrada”. Zend Framework fornece uma interface para processar as rotas,RouteStackInterface. Este RouteStackInterface tem a opção de adicionar / remover rotas.
A lista completa de RouteStackInterface é a seguinte -
namespace Zend\Mvc\Router;
interface RouteStackInterface extends RouteInterface {
public function addRoute($name, $route, $priority = null); public function addRoutes(array $routes);
public function removeRoute($name); public function setRoutes(array $routes);
}
O framework Zend fornece duas implementações do RouteStack interface e eles são os seguintes -
- SimpleRouteStack
- TreeRouteStack
Tipo de Rotas
O Zend framework oferece muitos objetos de rota prontos para todas as situações no namespace "Zend \ Mvc \ Router \ Http". Basta selecionar e usar o objeto de rota adequado para a situação dada.
As rotas disponíveis são as seguintes -
Hostname - Usado para corresponder à parte do host do URI.
Literal - Usado para corresponder ao URI exato.
Method - Usado para corresponder ao método HTTP da solicitação de entrada.
Part - Usado para corresponder à parte do segmento do caminho URI usando lógica personalizada.
Regex - Usado para corresponder ao segmento de caminho URI por padrão Regex.
Schema - Usado para corresponder ao esquema URI, como http, https, etc.
Segment - Usado para combinar o caminho do URI, dividindo-o em vários segmentos.
Vamos ver como escrever o literal e segmento Route mais comumente usado. As rotas são geralmente especificadas no arquivo de configuração de cada módulo -module.config.php.
Rota Literal
Normalmente, as rotas são consultadas em uma ordem LIFO. A rota literal é para fazer a correspondência exata do caminho URI.
É definido como mostrado abaixo -
$route = Literal::factory(array(
'route' => '/path',
'defaults' => array('controller' => 'Application\Controller\IndexController',
'action' => 'index',),
));
A rota acima corresponde ao /path no URL da solicitação e retorna index Enquanto o action e IndexController como controlador.
Rota do Segmento
Uma rota segmentada é usada sempre que seu url deve conter parâmetros variáveis.
É descrito conforme abaixo -
$route = Segment::factory(array(
'route' => '/:controller[/:action]',
'constraints' => array(
'controller' => '[a-zA-Z][a-zA-Z0-9_-]+',
'action' => '[a-zA-Z][a-zA-Z0-9_-]+',
),
'defaults' => array(
'controller' => 'Application\Controller\IndexController',
'action' => 'index',),
));
Aqui, os segmentos são indicados por dois pontos e seguidos por caracteres alfanuméricos. Se você mantiver um segmento opcional, ele será colocado entre colchetes. Cada segmento pode ter restrições associadas a ele. Cada restrição é uma expressão regular.
Configurando a rota no módulo tutorial
Vamos adicionar uma rota de segmento em nosso módulo Tutorial. Atualize o arquivo de configuração do módulo tutorial -module.config.php disponível em myapp/module/Tutorial/config.
<?php
namespace Tutorial;
use Zend\ServiceManager\Factory\InvokableFactory;
use Zend\Router\Http\Segment;
return [
'controllers' => [
'factories' => [
Controller\TutorialController::class => InvokableFactory::class,
],
],
'router' => [
'routes' => [
'tutorial' => [
'type' => Segment::class,
'options' => [
'route' => '/tutorial[/:action[/:id]]',
'constraints' => [
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[0-9]+',
],
'defaults' => [
'controller' => Controller\TutorialController::class,
'action' => 'index',
],
],
],
],
],
'view_manager' => [
'template_path_stack' => ['tutorial' => __DIR__ . '/../view',],
],
];
Adicionamos com sucesso o roteamento para nosso Tutorialmódulo. Estamos apenas um passo atrás na conclusão do nosso módulo Tutorial. Precisamos adicionarView para o nosso módulo, que aprenderemos no capítulo subsequente.