- CakePHP 教程
- CakePHP - 首页
- CakePHP - 概述
- CakePHP - 安装
- CakePHP - 文件夹结构
- CakePHP - 项目配置
- CakePHP - 路由
- CakePHP - 控制器
- CakePHP - 视图
- CakePHP - 扩展视图
- CakePHP - 视图元素
- CakePHP - 视图事件
- CakePHP - 数据库操作
- CakePHP - 查看记录
- CakePHP - 更新记录
- CakePHP - 删除记录
- CakePHP - 服务
- CakePHP - 错误和异常处理
- CakePHP - 日志记录
- CakePHP - 表单处理
- CakePHP - 国际化
- CakePHP - 会话管理
- CakePHP - Cookie 管理
- CakePHP - 安全
- CakePHP - 验证
- CakePHP - 创建验证器
- CakePHP - 分页
- CakePHP - 日期和时间
- CakePHP - 文件上传
- CakePHP 有用资源
- CakePHP - 快速指南
- CakePHP - 有用资源
- CakePHP - 讨论
CakePHP - 路由
在本章中,我们将学习以下与路由相关的主题:
- 路由简介
- 连接路由
- 向路由传递参数
- 生成 URL
- 重定向 URL
路由简介
在本节中,我们将了解如何实现路由,如何将 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方法。在这两种方法中,作用域路由构建器具有更好的性能。
连接路由
Router::connect()方法用于连接路由。以下是该方法的语法:
static Cake\Routing\Router::connect($route, $defaults =[], $options =[])
Router::connect()方法有三个参数:
第一个参数是您希望匹配的 URL 模板。
第二个参数包含路由元素的默认值。
第三个参数包含路由的选项,通常包含正则表达式规则。
这是一个路由的基本格式:
$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>
通过访问以下 URL(位于 https:///cakephp4/)来执行上述示例。
输出
上述 URL 将产生以下输出。
传递的参数
传递的参数是在 URL 中传递的参数。这些参数可以传递给控制器的操作。这些传递的参数可以通过三种方式传递给您的控制器。
作为操作方法的参数
以下示例展示了如何将参数传递给控制器的操作。访问以下 URL:https:///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的视图文件。将以下代码复制到该文件中。
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 https:///cakephp4/tests/Virat/Kunal 来执行上述示例。
输出
执行后,上述 URL 将产生以下输出。
生成 URL
这是 CakePHP 的一个很酷的功能。使用生成的 URL,我们可以轻松更改应用程序中 URL 的结构,而无需修改整个代码。
url( string|array|null $url null , boolean $full false )
上述函数将接收两个参数:
第一个参数是一个数组,指定以下任何一个:'controller'、'action'、'plugin'。此外,您还可以提供路由元素或查询字符串参数。如果为字符串,则可以将其指定为任何有效的 URL 字符串。
如果为真,则将在结果前加上完整的基 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->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下创建一个名为Generates的文件夹,并在该文件夹下创建一个名为show.php的视图文件。将以下代码复制到该文件中。
src/Template/Generates/show.php
<h1>This is CakePHP tutorial and this is an example of Generating URLs<h1>
通过访问以下 URL 执行上述示例:
https:///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://tutorialspoint.com/');
$builder->fallbacks();
});
通过访问以下 URL 执行上述示例。
URL 1 - https:///cakephp4/generate
URL 1 的输出
URL 2 - https:///cakephp4/redirect
URL 2 的输出
您将被重定向到 https://tutorialspoint.com