CakePHP 路由
在本章中,我们将学习以下与路由相关的主题:
路由介绍
连接路由
将参数传递给路由
生成网址
重定向网址
路由介绍
在本节中,我们将看到如何实现路由、如何将参数从 URL 传递到控制器的操作、如何生成 URL 以及如何重定向到特定 URL。通常,路由在文件config/routes.php中配置,路由可以通过两种方式实现:
静态方法
作用域路由构建器
这里是一个展示这两种类型的例子:
// 使用作用域路由构建器 Router::scope('/', function ($routes) { $routes->connect('/', ['controller' => 'Articles', 'action' => 'index']); }); // 使用静态方法。 Router::connect('/', ['controller' => 'Articles', 'action' => 'index']);
这两种方法都会执行ArticlesController的index方法,其中作用域路由构建器的性能更好。
连接路由
Router::connect()方法用于连接路由,以下是该方法的语法:
static Cake\Routing\Router::connect($route, $defaults =[], $options =[])
Router::connect()有以下三个参数:
第一个参数是希望匹配的 URL 模板;
第二个参数包含路由元素的默认值;
第三个参数包含路由的选项,通常包含正则表达式规则。
这里是路由的基本格式:
$routes->connect( 'URL template', ['default' => 'defaultValue'], ['option' => 'matchingRegex'] );
在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) { // 为 in 范围注册作用域中间件。 $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 文件,将以下代码复制到控制器文件中:
<?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的View文件,将以下代码复制到该文件中:
<h1>This is CakePHP tutorial and this is an example of connecting routes.</h1>
然后访问 http://localhost/cakephp4/ ,将看到输出如下所示:
传递参数
传递参数,即 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文件中进行修改,如下所示:
<?php use Cake\Http\Middleware\CsrfProtectionMiddleware; use Cake\Routing\Route\DashedRoute; use Cake\Routing\RouteBuilder; $routes->setRouteClass(DashedRoute::class); $routes->scope('/', function (RouteBuilder $builder) { // 为 in 范围注册作用域中间件。 $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 文件,将以下代码复制到控制器文件中:
<?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视图文件,将以下代码复制到该文件中:
<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/>"; ?>
访问 http://localhost/cakephp4/tests/Virat/Kunal,输出如下所示:
生成 URL
这是CakePHP的一个很酷的功能,使用生成的URLs,我们可以很容易地改变应用中的URL结构,而无需修改整个代码。
url( string|array|null $url null , boolean $full false )
上述函数接受两个参数:
第一个参数是一个数组,指定以下任何一项:"控制器"、"动作"、"插件",此外,你可以提供路由元素或查询字符串参数,如果是字符串,可以给出任何有效的url字符串的名称。
如果为 true,将返回完整的 URL,默认为 false。
修改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) { // 为 in 范围注册作用域中间件。 $builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([ 'httpOnly' => true, ])); $builder->applyMiddleware('csrf'); $builder->connect('/generate',['controller'=>'Generates','action'=>'show']); $builder->fallbacks(); });
新建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/Generates文件夹,并在该文件夹下创建show.php视图文件,复制以下代码到该文件中:
<h1>This is CakePHP tutorial and this is an example of Generating URLs<h1>
访问http://localhost/cakephp4/generate来执行上述示例,输出如下所示:
重定向路由
重定向路由很有用,当我们要通知浏览器此 URL 已被移动时,可以使用以下函数重定向 URL:
static Cake\Routing\Router::redirect($route, $url, $options =[])
上述函数共有三个参数,如下所示:
描述路由模板的字符串;
要重定向到的 URL;
将路由中的命名元素与该元素应匹配的正则表达式匹配的数组。
修改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) { // 为 in 范围注册作用域中间件。 $builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([ 'httpOnly' => true, ])); $builder->applyMiddleware('csrf'); $builder->connect('/generate',['controller'=>'Generates','action'=>'show']); $builder->redirect('/redirect','https://www.newbiego.com/'); $builder->fallbacks(); });
通过访问以下 URL 执行上述示例:
URL 1: 访问 http://localhost/cakephp4/generate,输出如下所示:
URL 2: 访问 http://localhost/cakephp4/redirect,你将被重定向到 https://www.newbiego.com/。