CakePHP 路由
在本章中,我们将学习以下与路由相关的主题:
- 路由简介
- 连接路线
- 将参数传递给路由
- 生成网址
- 重定向网址
路由简介
在本节中,我们将了解如何实现路由、如何将参数从 URL 传递到控制器的操作、如何生成 URL 以及如何重定向到特定 URL。通常,路由在文件 config/routes.php 中实现。路由可以通过两种方式实现:
- 静态方法
- 范围路由构建器
这是一个展示这两种类型的示例。
// 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']);
这两个方法都会执行 ArticlesController的index方法。出去在这两种方法中, scoped route builder 提供了更好的性能。
连接路线
Router::connect() 方法用于连接路由。以下是该方法的语法:
static Cake\Routing\Router::connect($route, $defaults =[], $options =[])
Router::connect() 方法有三个参数:
- 第一个参数是您要匹配的网址模板。
- 第二个参数包含路由元素的默认值。
- 第三个参数包含路由选项,通常包含正则表达式规则。
这里是路由的基本格式:
$routes->connect( 'URL template', ['default' => 'defaultValue'], ['option' => 'matchingRegex'] );
示例
在 config/routes.php 文件中进行如下更改。
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(); });
在 src/Controller/TestsController.php 中创建一个 TestsController.php 文件。 将以下代码复制到控制器文件中。
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() { } }
在 src/Template 下创建一个文件夹 Tests,然后在该文件夹下创建一个名为show.php 的 查看文件。将以下代码复制到该文件中。
src/Template/Tests/show.php
<h1>this is CakePHP tutorial and this is an example of connecting routes.</h1>
通过访问 http://localhost/cakephp4/提供的以下 URL 执行上述示例
输出
上述 URL 将产生以下输出。
传递的参数
传递的参数是在 URL 中传递的参数。这些参数可以传递给控制器的动作。这些传递的参数以三种方式提供给您的控制器。
作为动作方法的参数
以下示例显示了我们如何将参数传递给控制器的操作。访问以下 URL:http://localhost/cakephp4/tests/value1/value2
这将匹配以下路线。
$builder->connect('tests/:arg1/:arg2', ['controller' => 'Tests', 'action' => 'show'],['pass' => ['arg1', 'arg2']]);
这里,来自 URL 的 value1 将分配给 arg1,value2 将分配给 arg2、
作为数字索引数组
一旦将参数传递给控制器的操作,您就可以使用以下语句获取参数。
$args = $this->request->params[‘pass’]
传递给控制器动作的参数将存储在 $args 变量中。
使用路由数组
参数也可以通过以下语句传递给动作:
$routes->connect('/', ['controller' => 'Tests', 'action' => 'show',5,6]);
上面的语句将两个参数 5 和 6 传递给 TestController 的 show() 方法。
示例
在 config/routes.php 文件中进行更改,如下面的程序所示。
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(); });
在 src/Controller/TestsController.php 中创建一个 TestsController.php 文件。 将以下代码复制到控制器文件中。
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); } }
在 src/Template 中创建一个 Tests 文件夹,然后在该文件夹下创建一个名为show.php 的 View 文件。将以下代码复制到该文件中。
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/>"; ?>
通过访问以下 URL http://localhost/cakephp4/tests/Virat/Kunal 来执行上面的例子
输出
执行后,上述 URL 将产生以下输出。
生成网址
这是 CakePHP 的一个很酷的特性。使用生成的 URL,我们可以轻松更改应用程序中 URL 的结构,而无需修改整个代码。
url( string|array|null $url null , boolean $full false )
上述函数将接受两个参数:
- 第一个参数是一个数组,指定以下任何一项-'controller'、'action'、'plugin'。此外,您可以提供路由元素或查询字符串参数。如果是字符串,则可以为其指定任何有效 url 字符串的名称。
- 如果为 true,完整的基本 URL 将被添加到结果中。默认值为 false。
示例
在 config/routes.php 文件中进行更改,如下面的程序所示。
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(); });
在 src/Controller/GeneratesController.php 中创建一个 GeneratesController.php 文件。 将以下代码复制到控制器文件中。
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() { } }
创建一个文件夹 在 src/Template 生成,然后在该文件夹下创建一个名为 show.php 的 View 文件。将以下代码复制到该文件中。
src/Template/Generates/show.php
<h1>this is CakePHP tutorial and this is an example of Generating URLs<h1>
通过访问以下 URL 执行上述示例:
http://localhost/cakephp4/generate
输出
上述 URL 将产生以下输出:
重定向路由
重定向路由很有用,当我们要通知客户端应用程序此 URL 已被移动时。可以使用以下函数重定向 URL:
static Cake\Routing\Router::redirect($route, $url, $options =[])
上述函数的三个参数如下:
- 描述路由模板的字符串。
- 要重定向到的 URL。
- 将路由中的命名元素与该元素应匹配的正则表达式相匹配的数组。
示例
在 config/routes.php 文件中进行更改,如下所示。在这里,我们使用了之前创建的控制器。
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://lidihuo.com/'); $builder->fallbacks(); });
通过访问以下 URL 执行上述示例。
URL 1-http://localhost/cakephp4/generate
URL 1 的输出
URL 2-http://localhost/cakephp4/redirect
URL 2 的输出
您将被重定向到 https://lidihuo.com
下一章:CakePHP 控制器
如名称所示的控制器控制应用程序。它就像模型和视图之间的桥梁。控制器处理请求数据,确保调用正确的模型并呈现正确的响应或视图。 控制器类中的方法称为 动作。每个控制器都遵循命名约定。 Controller ...