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