在本章中,我們將學習以下與路由相關的主題 -
在本節中,我們將了解如何實作路由、如何將參數從 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 來執行上述範例,該 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]);
上面的語句將向 TestController 的 show() 方法傳遞兩個參數 5 和 6。
在 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 的 View 檔案。將以下程式碼複製到該文件中。
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 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
<?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(); });
Create a GeneratesController.php file at src/Controller/GeneratesController.php. Copy the following code in the controller file.
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() { } }
Create a folder Generates at src/Template and under that folder, create a View file called show.php. Copy the following code in that file.
src/Template/Generates/show.php
<h1>This is CakePHP tutorial and this is an example of Generating URLs<h1>
Execute the above example by visiting the following URL −
http://localhost/cakephp4/generate
The above URL will produce the following output −
Redirect routing is useful, when we want to inform client applications that, this URL has been moved. The URL can be redirected using the following function −
static Cake\Routing\Router::redirect($route, $url, $options =[])
There are three arguments to the above function as follows −
A string describing the template of the route.
A URL to redirect to.
An array matching the named elements in the route to regular expressions which that element should match.
Make Changes in the config/routes.php file as shown below. Here, we have used controllers that were created previously.
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(); });
Execute the above example by visiting the following URLs.
URL 1 − http://localhost/cakephp4/generate
URL 2 − http://localhost/cakephp4/redirect
You will be redirected to https://tutorialspoint.com
以上是CakePHP 路由的詳細內容。更多資訊請關注PHP中文網其他相關文章!