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.