CakePHP - Enrutamiento
En este capítulo, aprenderemos los siguientes temas relacionados con el enrutamiento:
- Introducción al enrutamiento
- Rutas de conexión
- Pasar argumentos a rutas
- Generando URLs
- URL de redireccionamiento
Introducción al enrutamiento
En esta sección, veremos cómo puede implementar rutas, cómo puede pasar argumentos de la URL a la acción del controlador, cómo puede generar URL y cómo puede redirigir a una URL específica. Normalmente, las rutas se implementan en archivoconfig/routes.php. El enrutamiento se puede implementar de dos maneras:
- método estático
- constructor de rutas con alcance
A continuación, se muestra un ejemplo que presenta ambos tipos.
// Using the scoped route builder.
Router::scope('/', function ($routes) {
$routes->connect('/', ['controller' => 'Articles', 'action' => 'index']);
});
// Using the static method.
Router::connect('/', ['controller' => 'Articles', 'action' => 'index']);
Ambos métodos ejecutarán el método de índice de ArticlesController. De los dos métodos,scoped route builder da un mejor rendimiento.
Rutas de conexión
Router::connect()El método se utiliza para conectar rutas. La siguiente es la sintaxis del método:
static Cake\Routing\Router::connect($route, $defaults =[], $options =[])
Hay tres argumentos para Router::connect() método -
El primer argumento es para la plantilla de URL que desea hacer coincidir.
El segundo argumento contiene valores predeterminados para sus elementos de ruta.
El tercer argumento contiene opciones para la ruta, que generalmente contiene reglas de expresión regular.
Aquí está el formato básico de una ruta:
$routes->connect(
'URL template',
['default' => 'defaultValue'],
['option' => 'matchingRegex']
);
Ejemplo
Realice cambios en el config/routes.php archivo como se muestra a continuación.
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
// Register scoped middleware for in scopes.
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
$builder->connect('/', ['controller' => 'Tests', 'action' => 'show']);
$builder->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
$builder->fallbacks();
});
Crear un TestsController.php archivar en src/Controller/TestsController.php. Copie el siguiente código en el archivo del controlador.
src/Controller/TestsController.php
<?php
declare(strict_types=1);
namespace App\Controller;
use Cake\Core\Configure;
use Cake\Http\Exception\ForbiddenException;
use Cake\Http\Exception\NotFoundException;
use Cake\Http\Response;
use Cake\View\Exception\MissingTemplateException;
class TestsController extends AppController {
public function show()
{
}
}
Crea una carpeta Tests debajo src/Template y debajo de esa carpeta, cree un View filellamado show.php. Copie el siguiente código en ese archivo.
src/Template/Tests/show.php
<h1>This is CakePHP tutorial and this is an example of connecting routes.</h1>
Ejecute el ejemplo anterior visitando la siguiente URL que está disponible en http: // localhost / cakephp4 /
Salida
La URL anterior producirá el siguiente resultado.
Argumentos aprobados
Los argumentos pasados son los argumentos que se pasan en la URL. Estos argumentos se pueden pasar a la acción del controlador. Estos argumentos pasados se le dan a su controlador de tres formas.
Como argumentos del método de acción
El siguiente ejemplo muestra cómo podemos pasar argumentos a la acción del controlador. Visite la siguiente URL en http: // localhost / cakephp4 / tests / value1 / value2
Esto coincidirá con la siguiente línea de ruta.
$builder->connect('tests/:arg1/:arg2', ['controller' => 'Tests', 'action' => 'show'],['pass' => ['arg1', 'arg2']]);
Aquí, el valor1 de la URL se asignará a arg1 y el valor2 se asignará a arg2.
Como matriz indexada numéricamente
Una vez que el argumento se pasa a la acción del controlador, puede obtener el argumento con la siguiente declaración.
$args = $this->request->params[‘pass’]
Los argumentos pasados a la acción del controlador se almacenarán en la variable $ args.
Usando matriz de enrutamiento
El argumento también se puede pasar a la acción mediante la siguiente declaración:
$routes->connect('/', ['controller' => 'Tests', 'action' => 'show',5,6]);
La declaración anterior pasará dos argumentos 5 y 6 al método show () de TestController.
Ejemplo
Realizar cambios en el config/routes.php archivo como se muestra en el siguiente programa.
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
// Register scoped middleware for in scopes.
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
$builder->connect('tests/:arg1/:arg2', ['controller' => 'Tests', 'action' => 'show'],['pass' => ['arg1', 'arg2']]);
$builder->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
$builder->fallbacks();
});
Crear un TestsController.php archivar en src/Controller/TestsController.php. Copie el siguiente código en el archivo del controlador.
src/Controller/TestsController.php
<?php
declare(strict_types=1);
namespace App\Controller;
use Cake\Core\Configure;
use Cake\Http\Exception\ForbiddenException;
use Cake\Http\Exception\NotFoundException;
use Cake\Http\Response;
use Cake\View\Exception\MissingTemplateException;
class TestsController extends AppController {
public function show($arg1, $arg2) {
$this->set('argument1',$arg1);
$this->set('argument2',$arg2);
}
}
Crea una carpeta Tests a src/Template y debajo de esa carpeta crea un Viewarchivo llamado show.php. Copie el siguiente código en ese archivo.
src/Template/Tests/show.php.
<h1>This is CakePHP tutorial and this is an example of Passed arguments.</h1>
<?php
echo "Argument-1:".$argument1."<br/>";
echo "Argument-2:".$argument2."<br/>";
?>
Ejecute el ejemplo anterior visitando la siguiente URL http: // localhost / cakephp4 / tests / Virat / Kunal
Salida
Tras la ejecución, la URL anterior producirá el siguiente resultado.
Generando URL
Esta es una característica interesante de CakePHP. Usando las URL generadas, podemos cambiar fácilmente la estructura de la URL en la aplicación sin modificar todo el código.
url( string|array|null $url null , boolean $full false )
La función anterior tomará dos argumentos:
El primer argumento es una matriz que especifica cualquiera de los siguientes: 'controller', 'action', 'plugin'. Además, puede proporcionar elementos enrutados o parámetros de cadena de consulta. Si es una cadena, se le puede dar el nombre de cualquier cadena de URL válida.
Si es verdadero, la URL base completa se antepondrá al resultado. El valor predeterminado es falso.
Ejemplo
Realizar cambios en el config/routes.php archivo como se muestra en el siguiente programa.
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
// Register scoped middleware for in scopes.
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
$builder->connect('/generate',['controller'=>'Generates','action'=>'show']);
$builder->fallbacks();
});
Crear un GeneratesController.php archivar en src/Controller/GeneratesController.php. Copie el siguiente código en el archivo del controlador.
src/Controller/GeneratesController.php
<?php
declare(strict_types=1);
namespace App\Controller;
21
use Cake\Core\Configure;
use Cake\Http\Exception\ForbiddenException;
use Cake\Http\Exception\NotFoundException;
use Cake\Http\Response;
use Cake\View\Exception\MissingTemplateException;
class GeneratesController extends AppController {
public function show()
{
}
}
Crea una carpeta Generates at src/Template y debajo de esa carpeta, cree un Viewarchivo llamado show.php. Copie el siguiente código en ese archivo.
src/Template/Generates/show.php
<h1>This is CakePHP tutorial and this is an example of Generating URLs<h1>
Ejecute el ejemplo anterior visitando la siguiente URL:
http: // localhost / cakephp4 / generate
Salida
La URL anterior producirá el siguiente resultado:
Enrutamiento de redireccionamiento
El enrutamiento de redireccionamiento es útil cuando queremos informar a las aplicaciones cliente que esta URL se ha movido. La URL se puede redirigir utilizando la siguiente función:
static Cake\Routing\Router::redirect($route, $url, $options =[])
Hay tres argumentos para la función anterior de la siguiente manera:
Una cadena que describe la plantilla de la ruta.
Una URL a la que redireccionar.
Una matriz que coincide con los elementos nombrados en la ruta a las expresiones regulares que ese elemento debe coincidir.
Ejemplo
Realizar cambios en el config/routes.phparchivo como se muestra a continuación. Aquí, hemos utilizado controladores que se crearon anteriormente.
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
// Register scoped middleware for in scopes.
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
$builder->connect('/generate',['controller'=>'Generates','action'=>'show']);
$builder->redirect('/redirect','https://tutorialspoint.com/');
$builder->fallbacks();
});
Ejecute el ejemplo anterior visitando las siguientes URL.
URL 1 - http: // localhost / cakephp4 / generate
Salida para URL 1
URL 2 - http: // localhost / cakephp4 / redirect
Salida para URL 2
Serás redirigido a https://tutorialspoint.com