CakePHP路由
路由将您的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 CakeRoutingRouter::connect($route, $defaults =[], $options =[])
Router:: connect()方法有三个参数-
第一个参数是要匹配的URL模板。
第二个参数包含路由元素的默认值。
第三个参数包含路由的选项,一般包含正则表达式规则。
这里是一个路由的基本格式 -
$routes->connect( 'URL template', ['default' => 'defaultValue'], ['option' => 'matchingRegex'] );
例
修改如下图config/routes.php文件。
config/routes.php文件
<?php use CakeCorePlugin; use CakeRoutingRouteBuilder; use CakeRoutingRouter; Router::defaultRouteClass('DashedRoute'); Router::scope('/', function (RouteBuilder $routes) { $routes->connect('/', ['controller' => 'Tests', 'action' => 'index']); $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']); $routes->fallbacks('DashedRoute'); }); Plugin::routes();
在src/Controller/中创建一个TestsController.php文件。复制以下代码至其中。
src/Controller/TestsController.php
<?php namespace AppController; use AppControllerAppController; class TestsController extends AppController{ public function index(){ } } ?>
在src/Template目录下创建一个文件夹Tests,并在Tests文件夹下创建一个名为index.ctp一个视图文件 。复制以下代码至此文件中。
src/Template/Tests/index.ctp
This is CakePHP tutorial and this is an example of connecting routes.
通过访问以下网址执行上面的例子。
http//localhost:85/CakePHP/
上面的URL将显示如下页面。
传递的参数
传递的参数是指在URL中传递的参数,这些参数可以传递给控制器行为。这些参数有3种方法传递给控制器。
作为参数传递给操作方法
下面的例子显示我们如何将参数传递给控制器的操作方法。
请访问以下网址- http://localhost:85/CakePHP/Tests/value1/value2
这将匹配以下路由线路。
$routes->connect('tests/:arg1/:arg2', ['controller' => 'Tests', 'action' => 'index'],['pass' => ['arg1', 'arg2']]);
在这里,URL中的value1将被分配给参数1,value2将被分配给参数2。
作为数字索引数组
一旦参数被传递给控制器的操作方法,你可以用下面的语法获取参数。
$args = $this->request->params[‘pass’]
传递给控制器操作方法的参数将被存储在$args变量里。
使用路由数组
参数也可以由以下语句传递到操作方法 -
$routes->connect('/', ['controller' => 'Tests', 'action' => 'index',5,6]);
上面的语句将传递两个参数5和6 到TestController index()方法。
例
修改以下所示config / routes.php文件。
配置/ routes.php文件
<?php use CakeCorePlugin; use CakeRoutingRouteBuilder; use CakeRoutingRouter; Router::defaultRouteClass('DashedRoute'); Router::scope('/', function (RouteBuilder $routes) { $routes->connect('tests/:arg1/:arg2', ['controller' => 'Tests', 'action'=> 'index'],['pass' =>['arg1', 'arg2']]); $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']); $routes->fallbacks('DashedRoute'); }); Plugin::routes();
在src/Controller/下创建一个TestsController.php文件。复制以下代码至此文件中。
src/Controller/TestsController.php
<?php namespace AppController; use AppControllerAppController; class TestsController extends AppController{ public function index($arg1,$arg2){ $this->set('argument1',$arg1); $this->set('argument2',$arg2); } } ?>
在src/Template目录下创建一个文件夹Tests,并在Tests下创建一个名为index.ctp一个视图文件。复制以下代码至其中。
src/Template/Tests/index.ctp
This is CakePHP tutorial and this is an example of Passed arguments.<br /> Argument-1: <?=$argument1?><br /> Argument-2: <?=$argument2?><br />
通过访问以下网址执行上面的例子。
http://localhost:85/CakePHP/tests/Virat/Kunal
以上URL会显示以下页面。