CakePHP - Roteamento
Neste capítulo, aprenderemos os seguintes tópicos relacionados ao roteamento -
- Introdução ao Roteamento
- Rotas de conexão
- Passando Argumentos para Rotas
- Gerando urls
- Redirecionar urls
Introdução ao Roteamento
Nesta seção, veremos como você pode implementar rotas, como passar argumentos de URL para ação do controlador, como pode gerar URLs e como redirecionar para uma URL específica. Normalmente, as rotas são implementadas em arquivoconfig/routes.php. O roteamento pode ser implementado de duas maneiras -
- método estático
- construtor de rota com escopo
Aqui está um exemplo apresentando ambos os 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 os métodos irão executar o método de índice de ArticlesController. Dos dois métodos,scoped route builder oferece melhor desempenho.
Rotas de conexão
Router::connect()método é usado para conectar rotas. A seguir está a sintaxe do método -
static Cake\Routing\Router::connect($route, $defaults =[], $options =[])
Existem três argumentos para o Router::connect() método -
O primeiro argumento é para o modelo de URL que você deseja corresponder.
O segundo argumento contém valores padrão para seus elementos de rota.
O terceiro argumento contém opções para a rota, que geralmente contém regras de expressão regular.
Aqui está o formato básico de uma rota -
$routes->connect(
'URL template',
['default' => 'defaultValue'],
['option' => 'matchingRegex']
);
Exemplo
Faça alterações no config/routes.php arquivo como mostrado abaixo.
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();
});
Criar uma TestsController.php arquivo em src/Controller/TestsController.php. Copie o código a seguir no arquivo do 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()
{
}
}
Crie uma pasta Tests sob src/Template e nessa pasta, crie um View filechamado show.php. Copie o código a seguir nesse arquivo.
src/Template/Tests/show.php
<h1>This is CakePHP tutorial and this is an example of connecting routes.</h1>
Execute o exemplo acima visitando a seguinte URL que está disponível em http: // localhost / cakephp4 /
Resultado
O URL acima produzirá a seguinte saída.
Argumentos Aprovados
Os argumentos passados são os argumentos passados no URL. Esses argumentos podem ser passados para a ação do controlador. Esses argumentos passados são fornecidos ao seu controlador de três maneiras.
Como argumentos para o método de ação
O exemplo a seguir mostra como podemos passar argumentos para a ação do controlador. Visite o seguinte URL em http: // localhost / cakephp4 / tests / value1 / value2
Isso corresponderá à seguinte linha de rota.
$builder->connect('tests/:arg1/:arg2', ['controller' => 'Tests', 'action' => 'show'],['pass' => ['arg1', 'arg2']]);
Aqui, o valor1 do URL será atribuído a arg1 e o valor2 será atribuído a arg2.
Como uma matriz numericamente indexada
Depois que o argumento é passado para a ação do controlador, você pode obter o argumento com a seguinte instrução.
$args = $this->request->params[‘pass’]
Os argumentos passados para a ação do controlador serão armazenados na variável $ args.
Usando array de roteamento
O argumento também pode ser passado para a ação pela seguinte declaração -
$routes->connect('/', ['controller' => 'Tests', 'action' => 'show',5,6]);
A instrução acima passará dois argumentos 5 e 6 para o método show () do TestController.
Exemplo
Faça alterações no config/routes.php arquivo conforme mostrado no programa a seguir.
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();
});
Criar uma TestsController.php arquivo em src/Controller/TestsController.php. Copie o código a seguir no arquivo do 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);
}
}
Crie uma pasta Tests em src/Template e nessa pasta crie um Viewarquivo chamado show.php. Copie o código a seguir nesse arquivo.
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/>";
?>
Execute o exemplo acima visitando a seguinte URL http: // localhost / cakephp4 / tests / Virat / Kunal
Resultado
Após a execução, o URL acima produzirá a seguinte saída.
Gerando URLs
Este é um recurso interessante do CakePHP. Usando as URLs geradas, podemos facilmente alterar a estrutura da URL no aplicativo sem modificar todo o código.
url( string|array|null $url null , boolean $full false )
A função acima terá dois argumentos -
O primeiro argumento é uma matriz que especifica qualquer um dos seguintes - 'controller', 'action', 'plugin'. Além disso, você pode fornecer elementos roteados ou parâmetros de string de consulta. Se for string, pode receber o nome de qualquer string de url válida.
Se verdadeiro, o URL base completo será anexado ao resultado. O padrão é falso.
Exemplo
Faça alterações no config/routes.php arquivo conforme mostrado no programa a seguir.
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();
});
Criar uma GeneratesController.php arquivo em src/Controller/GeneratesController.php. Copie o código a seguir no arquivo do 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()
{
}
}
Crie uma pasta Generates at src/Template e nessa pasta, crie um Viewarquivo chamado show.php. Copie o código a seguir nesse arquivo.
src/Template/Generates/show.php
<h1>This is CakePHP tutorial and this is an example of Generating URLs<h1>
Execute o exemplo acima visitando o seguinte URL -
http: // localhost / cakephp4 / generate
Resultado
O URL acima produzirá o seguinte resultado -
Redirecionar roteamento
O roteamento de redirecionamento é útil quando queremos informar aos aplicativos clientes que este URL foi movido. O URL pode ser redirecionado usando a seguinte função -
static Cake\Routing\Router::redirect($route, $url, $options =[])
Existem três argumentos para a função acima, como segue -
Uma string que descreve o modelo da rota.
Um URL para o qual redirecionar.
Uma matriz que corresponde aos elementos nomeados na rota para expressões regulares que esse elemento deve corresponder.
Exemplo
Faça alterações no config/routes.phparquivo como mostrado abaixo. Aqui, usamos controladores que foram criados 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();
});
Execute o exemplo acima visitando os seguintes URLs.
URL 1 - http: // localhost / cakephp4 / generate
Saída para URL 1
URL 2 - http: // localhost / cakephp4 / redirect
Saída para URL 2
Você será redirecionado para https://tutorialspoint.com