Zend Framework - Enrutamiento

Mapas de enrutamiento Request URIal método de un controlador específico. En este capítulo, veremos cómo implementar las rutas en un Zend Framework.

En general, cualquier URI tiene tres partes:

  • Segmento de nombre de host,
  • Segmento de ruta, y
  • Segmento de consulta.

Por ejemplo, en URI / URL - http://www.example.com/index?q=data, www.example.com es el segmento de nombre de host, index es el segmento de ruta y q=dataes el segmento de consulta. Generalmente, el enrutamiento verificaPage segmentcontra un conjunto de restricciones. Si alguna restricción coincide, devuelve un conjunto de valores. Uno de los principales valores es el controlador.

El enrutamiento también verifica el segmento de host, el segmento de consulta, los métodos HTTP de solicitud, los encabezados HTTP de solicitud, etc., en una situación determinada.

Ruta y RouteStack

La ruta es el objeto principal del enrutamiento. Zend Framework tiene una interfaz especial para el objeto de ruta,RouteInterface. Todos los objetos de ruta deben implementar RouteInterface. La lista completa de RouteInterface es la siguiente:

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 = []); 
}

El método principal es match. Este método de coincidencia compara la solicitud dada con la restricción definida en ella. Si se encuentra alguna coincidencia, devuelve elRouteMatchobjeto. Este objeto RouteMatch proporciona los detalles de la solicitud coincidente como parámetros. Estos parámetros se pueden extraer deRouteObject utilizando el getParams método.

La lista completa de RouteObject es la siguiente:

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); 
}

En general, una aplicación MVC típica tiene muchas rutas. Cada una de estas rutas se procesará en orden LIFO y se comparará y devolverá una sola ruta. Si ninguna ruta coincide / devuelve, la aplicación devuelve el error "Página no encontrada". Zend Framework proporciona una interfaz para procesar las rutas,RouteStackInterface. Esta RouteStackInterface tiene la opción de agregar / eliminar rutas.

La lista completa de RouteStackInterface es la siguiente:

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); 
}

Zend framework proporciona dos implementaciones del RouteStack interfaz y son los siguientes:

  • SimpleRouteStack
  • TreeRouteStack

Tipo de rutas

Zend framework proporciona muchos objetos de ruta listos para usar para todas las situaciones en el espacio de nombres "Zend \ Mvc \ Router \ Http". Es suficiente seleccionar y usar el objeto de ruta adecuado para la situación dada.

Las rutas disponibles son las siguientes:

  • Hostname - Se utiliza para hacer coincidir la parte del host del URI.

  • Literal - Se usa para coincidir con el URI exacto.

  • Method - Se utiliza para hacer coincidir el método HTTP de la solicitud entrante.

  • Part - Se utiliza para hacer coincidir la parte del segmento de ruta de URI mediante lógica personalizada.

  • Regex - Se utiliza para hacer coincidir el segmento de ruta de URI por patrón Regex.

  • Schema - Se utiliza para coincidir con el esquema de URI como http, https, etc.

  • Segment - Se utiliza para hacer coincidir la ruta de URI dividiéndola en varios segmentos.

Veamos cómo escribir la ruta de segmento y literal más utilizada. Las rutas generalmente se especifican en el archivo de configuración de cada módulo:module.config.php.

Ruta literal

Normalmente, las rutas se consultan en un orden LIFO. La ruta literal es para hacer la coincidencia exacta de la ruta URI.

Se define como se muestra a continuación:

$route = Literal::factory(array( 
   'route' => '/path', 
   'defaults' => array('controller' => 'Application\Controller\IndexController', 
      'action' => 'index',), 
));

La ruta anterior coincide con la /path en la URL de solicitud y devuelve index como el action y IndexController como controlador.

Ruta del segmento

Una ruta segmentada se utiliza siempre que se supone que su URL contiene parámetros variables.

Se describe como se indica a continuación:

$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',), 
));

Aquí, los segmentos se indican con dos puntos y seguidos de caracteres alfanuméricos. Si mantiene un segmento como opcional, se encierra entre corchetes. Cada segmento puede tener limitaciones asociadas. Cada restricción es una expresión regular.

Configuración de ruta en el módulo tutorial

Agreguemos una ruta de segmento en nuestro módulo Tutorial. Actualice el archivo de configuración del módulo del tutorial -module.config.php disponible en 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',], 
   ], 
];

Hemos agregado con éxito el enrutamiento para nuestro Tutorialmódulo. Estamos a un paso de completar nuestro módulo Tutorial. Necesitamos agregarView para nuestro módulo, que aprenderemos en el capítulo siguiente.