📜  CakePHP-路由

📅  最后修改于: 2020-10-26 05:09:47             🧑  作者: Mango


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

  • 路由介绍
  • 连接路线
  • 将参数传递给路线
  • 产生网址
  • 重定向网址

路由介绍

在本节中,我们将看到如何实现路由,如何将参数从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的索引方法。在这两种方法中,作用域路由生成器可提供更好的性能。

连接路线

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

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

src / Template下创建一个Tests文件夹,并在该文件夹下创建一个名为show.php的View文件。将以下代码复制到该文件中。

src /模板/测试/show.php

This is CakePHP tutorial and this is an example of connecting routes.

通过访问以下URL执行上述示例,该URL可从http:// localhost / cakephp4 /获得。

输出

上面的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

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

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-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

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

创建一个文件夹在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

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 -http:// localhost / cakephp4 / generate

URL 1的输出

执行网址

URL 2 -http:// localhost / cakephp4 / redirect

URL 2的输出

您将被重定向到https://tutorialspoint.com