CakePHP 路由


在本章中,我们将学习以下与路由相关的主题:

  • 路由介绍

  • 连接路由

  • 将参数传递给路由

  • 生成网址

  • 重定向网址

路由介绍


在本节中,我们将看到如何实现路由、如何将参数从 URL 传递到控制器的操作、如何生成 URL 以及如何重定向到特定 URL。通常,路由在文件config/routes.php中配置,路由可以通过两种方式实现:

  • 静态方法

  • 作用域路由构建器

这里是一个展示这两种类型的例子:

// 使用作用域路由构建器
Router::scope('/', function ($routes) {
    $routes->connect('/', ['controller' => 'Articles', 'action' => 'index']);
});
// 使用静态方法。
Router::connect('/', ['controller' => 'Articles', 'action' => 'index']);

这两种方法都会执行ArticlesControllerindex方法,其中作用域路由构建器的性能更好。

连接路由


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/ ,将看到输出如下所示:

Above 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文件中进行修改,如下所示:

<?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,输出如下所示:

Passed Argument

生成 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来执行上述示例,输出如下所示:

Generating URL

重定向路由


重定向路由很有用,当我们要通知浏览器此 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,输出如下所示:

Execute URL

URL 2: 访问 http://localhost/cakephp4/redirect,你将被重定向到 https://www.newbiego.com/。