CakePHP 路由

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

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

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

this is cakephp tutorial and this is an example of connecting routes.

通过访问 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

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

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.

this is cakephp tutorial and this is an example of passed arguments.

echo "argument-1:".$argument1." "; echo "argument-2:".$argument2." "; ?>

通过访问以下 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

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

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

this is cakephp tutorial and this is an example of generating urls

通过访问以下 url 执行上述示例:

http://localhost/cakephp4/generate

 

输出

上述 url 将产生以下输出:

 

重定向路由

重定向路由很有用,当我们要通知客户端应用程序此 url 已被移动时。可以使用以下函数重定向 url:

static cake\routing\router::redirect($route, $url, $options =[])

上述函数的三个参数如下:

  • 描述路由模板的字符串。
  • 要重定向到的 url。
  • 将路由中的命名元素与该元素应匹配的正则表达式相匹配的数组。

 

示例

在 config/routes.php 文件中进行更改,如下所示。在这里,我们使用了之前创建的控制器。

config/routes.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

相关文章