CakePHP - Định tuyến
Trong chương này, chúng ta sẽ tìm hiểu các chủ đề sau liên quan đến định tuyến -
- Giới thiệu về định tuyến
- Kết nối các tuyến đường
- Chuyển đối số thành tuyến
- Tạo url
- Url chuyển hướng
Giới thiệu về định tuyến
Trong phần này, chúng tôi sẽ xem cách bạn có thể triển khai các tuyến, cách bạn có thể chuyển đối số từ URL đến hành động của bộ điều khiển, cách bạn có thể tạo URL và cách bạn có thể chuyển hướng đến một URL cụ thể. Thông thường, các tuyến được thực hiện trong tệpconfig/routes.php. Định tuyến có thể được thực hiện theo hai cách:
- phương pháp tĩnh
- trình xây dựng tuyến đường có phạm vi
Đây là một ví dụ trình bày cả hai loại.
// 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']);
Cả hai phương thức sẽ thực thi phương thức chỉ mục của ArticlesController. Trong số hai phương pháp,scoped route builder cho hiệu suất tốt hơn.
Kết nối các tuyến đường
Router::connect()phương pháp được sử dụng để kết nối các tuyến đường. Sau đây là cú pháp của phương thức:
static Cake\Routing\Router::connect($route, $defaults =[], $options =[])
Có ba đối số cho Router::connect() phương pháp -
Đối số đầu tiên dành cho mẫu URL bạn muốn đối sánh.
Đối số thứ hai chứa các giá trị mặc định cho các phần tử tuyến đường của bạn.
Đối số thứ ba chứa các tùy chọn cho tuyến, thường chứa các quy tắc biểu thức chính quy.
Đây là định dạng cơ bản của một tuyến đường -
$routes->connect(
'URL template',
['default' => 'defaultValue'],
['option' => 'matchingRegex']
);
Thí dụ
Thực hiện các thay đổi trong config/routes.php tập tin như hình dưới đây.
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();
});
Tạo một TestsController.php nộp tại src/Controller/TestsController.php. Sao chép mã sau vào tệp bộ điều khiển.
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()
{
}
}
Tạo một thư mục Tests Dưới src/Template và trong thư mục đó, hãy tạo một View fileđược gọi là show.php. Sao chép mã sau vào tệp đó.
src/Template/Tests/show.php
<h1>This is CakePHP tutorial and this is an example of connecting routes.</h1>
Thực hiện ví dụ trên bằng cách truy cập URL sau đây có sẵn tại http: // localhost / cakephp4 /
Đầu ra
URL trên sẽ mang lại kết quả sau.
Đối số được thông qua
Các đối số được truyền là các đối số được truyền trong URL. Các đối số này có thể được chuyển cho hành động của bộ điều khiển. Các đối số được truyền này được cấp cho bộ điều khiển của bạn theo ba cách.
Làm đối số cho phương thức hành động
Ví dụ sau đây cho thấy, cách chúng ta có thể truyền các đối số cho hành động của bộ điều khiển. Truy cập URL sau tại http: // localhost / cakephp4 / tests / value1 / value2
Điều này sẽ phù hợp với tuyến đường sau đây.
$builder->connect('tests/:arg1/:arg2', ['controller' => 'Tests', 'action' => 'show'],['pass' => ['arg1', 'arg2']]);
Ở đây, value1 từ URL sẽ được gán cho arg1 và value2 sẽ được gán cho arg2.
Dưới dạng mảng được lập chỉ mục số
Khi đối số được chuyển cho hành động của bộ điều khiển, bạn có thể nhận đối số bằng câu lệnh sau.
$args = $this->request->params[‘pass’]
Các đối số được truyền cho hành động của controller sẽ được lưu trữ trong biến $ args.
Sử dụng mảng định tuyến
Đối số cũng có thể được chuyển cho hành động bằng câu lệnh sau:
$routes->connect('/', ['controller' => 'Tests', 'action' => 'show',5,6]);
Câu lệnh trên sẽ truyền hai đối số 5 và 6 cho phương thức show () của TestController.
Thí dụ
Thực hiện các thay đổi trong config/routes.php như được hiển thị trong chương trình sau đây.
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();
});
Tạo một TestsController.php nộp tại src/Controller/TestsController.php. Sao chép mã sau vào tệp bộ điều khiển.
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);
}
}
Tạo một thư mục Tests tại src/Template và trong thư mục đó, tạo một Viewtệp có tên show.php. Sao chép mã sau vào tệp đó.
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/>";
?>
Thực hiện ví dụ trên bằng cách truy cập URL sau http: // localhost / cakephp4 / tests / Virat / Kunal
Đầu ra
Khi thực thi, URL trên sẽ tạo ra kết quả sau.
Tạo URL
Đây là một tính năng thú vị của CakePHP. Sử dụng các URL đã tạo, chúng tôi có thể dễ dàng thay đổi cấu trúc của URL trong ứng dụng mà không cần sửa đổi toàn bộ mã.
url( string|array|null $url null , boolean $full false )
Hàm trên sẽ nhận hai đối số:
Đối số đầu tiên là một mảng chỉ định bất kỳ điều nào sau đây: 'controller', 'action', 'plugin'. Ngoài ra, bạn có thể cung cấp các phần tử được định tuyến hoặc tham số chuỗi truy vấn. Nếu chuỗi, nó có thể được đặt tên của bất kỳ chuỗi url hợp lệ nào.
Nếu đúng, URL cơ sở đầy đủ sẽ được thêm vào trước kết quả. Mặc định là sai.
Thí dụ
Thực hiện các thay đổi trong config/routes.php như được hiển thị trong chương trình sau đây.
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();
});
Tạo một GeneratesController.php nộp tại src/Controller/GeneratesController.php. Sao chép mã sau vào tệp bộ điều khiển.
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()
{
}
}
Tạo một thư mục Generates at src/Template và trong thư mục đó, hãy tạo một Viewtệp có tên show.php. Sao chép mã sau vào tệp đó.
src/Template/Generates/show.php
<h1>This is CakePHP tutorial and this is an example of Generating URLs<h1>
Thực hiện ví dụ trên bằng cách truy cập URL sau:
http: // localhost / cakephp4 / tạo
Đầu ra
URL trên sẽ tạo ra kết quả sau:
Định tuyến chuyển hướng
Định tuyến chuyển hướng rất hữu ích, khi chúng tôi muốn thông báo cho các ứng dụng khách rằng, URL này đã được di chuyển. URL có thể được chuyển hướng bằng chức năng sau:
static Cake\Routing\Router::redirect($route, $url, $options =[])
Có ba đối số cho hàm trên như sau:
Một chuỗi mô tả mẫu của tuyến đường.
Một URL để chuyển hướng đến.
Một mảng khớp các phần tử được đặt tên trong tuyến với biểu thức chính quy mà phần tử đó phải khớp.
Thí dụ
Thực hiện các thay đổi trong config/routes.phptập tin như hình dưới đây. Ở đây, chúng tôi đã sử dụng bộ điều khiển đã được tạo trước đó.
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();
});
Thực hiện ví dụ trên bằng cách truy cập các URL sau.
URL 1 - http: // localhost / cakephp4 / tạo
Đầu ra cho URL 1
URL 2 - http: // localhost / cakephp4 / redirect
Đầu ra cho URL 2
Bạn sẽ được chuyển hướng đến https://tutorialspoint.com