路由会自动处理 后端控制器 而 CMS 页面则在其 页面配置 中定义自己的 URL 路由。 插件也可以提供一个名为 routes.php 的文件,其中包含自定义路由逻辑,详见 Laravel 路由器服务。
├── plugins
| └── acme ← 作者名称
| └── blog ← 插件名称
| ├── controllers
| ├── models
| ├── Plugin.php
| └── routes.php ← 路由文件
采用这种方法,路由在 PHP 中使用 Route 门面定义。下面是一个示例路由,它可通过 https://yoursite.tld/api_acme_blog/cleanup_posts 使用 GET 请求访问。
Route::get('api_acme_blog/cleanup_posts', function() {
return Posts::cleanUp();
});你可以使用 Url 门面为你的路由生成 URL。
$url = Url::to('api_acme_blog/cleanup_posts');要定义路由,PHP 方法将与 HTTP 方法关联,它支持 get、post、patch、put、options 和 delete。最基本的路由只接受一个 URI 和一个 Closure。
Route::get('/', function () {
return 'Hello World';
});
Route::post('foo/bar', function () {
return 'Hello World';
});
Route::put('foo/bar', function () {
//
});
Route::delete('foo/bar', function () {
//
});有时您可能需要注册一个路由,以响应多个 HTTP 方法。您可以使用 match 方法来完成此操作。
Route::match(['get', 'post'], '/', function () {
return 'Hello World';
});你甚至可以使用 any 方法注册一个响应所有 HTTP 方法的路由。
Route::any('foo', function () {
return 'Hello World';
});对于大型应用程序,最好将路由组织在类中而不是闭包中。放置这些类的最佳位置是 handlers 目录。路由可以作为数组引用,该数组包含类名和方法名。在此示例中,/install 路由映射到 Installer 类和 install 方法。
Route::any('/install', [Installer::class, 'install']);接下来,在其中定义类和路由。在此示例中,文件位于 app/handlers/Installer.php。
namespace App\Handlers;
class Installer extends \Illuminate\Routing\Controller
{
/**
* Route: /install
*/
public function install()
{
return 'Welcome!';
}
}若要在路由中捕获 URI 片段,你可以通过定义路由参数来做到这一点。例如,从 URL 中捕获用户的 ID。
Route::get('user/{id}', function ($id) {
return 'User '.$id;
});你可以根据路由需要定义任意数量的路由参数。
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});路由参数始终用单个花括号包裹。当路由执行时,这些参数将被传递到你的路由的 Closure 中。
路由参数不能包含
-字符,请使用下划线 (_) 代替。
有时,你可能需要指定一个路由参数,但同时使其存在变为可选。你可以通过在参数名称后加上一个 ? 标记来实现:
Route::get('user/{name?}', function ($name = null) {
return $name;
});
Route::get('user/{name?}', function ($name = 'John') {
return $name;
});您可以使用路由实例上的 where 方法来约束路由参数的格式。 where 方法接受参数的名称和一个正则表达式,该正则表达式定义了参数应如何被约束。
Route::get('user/{name}', function ($name) {
//
})->where('name', '[A-Za-z]+');
Route::get('user/{id}', function ($id) {
//
})->where('id', '[0-9]+');
Route::get('user/{id}/{name}', function ($id, $name) {
//
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);命名路由允许您方便地为特定路由生成 URL 或重定向。在定义路由时,您可以使用 as 数组键为路由指定名称:
Route::get('user/profile', ['as' => 'profile', function () {
//
}]);如果您正在使用路由组(如下),您可以在路由组属性数组中指定一个 as 关键字,从而允许您为该组中的所有路由设置一个公共路由名称前缀:
Route::group(['as' => 'admin::'], function () {
Route::get('dashboard', ['as' => 'dashboard', function () {
// Route named "admin::dashboard"
}]);
});一旦您为给定路由分配了名称,您就可以使用该路由的名称在生成 URL 或重定向时,通过 Url::route 方法:
$url = Url::route('profile');
$redirect = Response::redirect()->route('profile');如果路由定义了参数,您可以将这些参数作为第二个参数传入 route 方法。给定的参数将会自动插入到 URL 中:
Route::get('user/{id}/profile', ['as' => 'profile', function ($id) {
//
}]);
$url = Url::route('profile', ['id' => 1]);路由组允许你跨大量路由共享路由属性,而无需在每个单独的路由上定义这些属性。共享属性以数组格式指定为 Route::group 方法的第一个参数。
路由组也可用于路由通配符子域名。 子域名可被分配路由参数,就像路由 URI 一样,从而让你捕获子域名的一部分以用于你的路由或控制器。 子域名可通过在组属性数组上使用 domain 键来指定:
Route::group(['domain' => '{account}.example.tld'], function () {
Route::get('user/{id}', function ($account, $id) {
//
});
});prefix 组数组属性可用于为组中的每个路由添加给定的 URI 前缀。例如,您可能希望为组中的所有路由 URI 添加 admin 前缀:
Route::group(['prefix' => 'admin'], function () {
Route::get('users', function () {
// Matches The "/admin/users" URL
});
});你还可以使用 prefix 参数来为你的分组路由指定通用参数:
Route::group(['prefix' => 'accounts/{account_id}'], function () {
Route::get('detail', function ($account_id) {
// Matches The accounts/{account_id}/detail URL
});
});在你的插件的 boot() 方法中注册中间件,将会针对每个请求全局注册它。
如果你想每次只针对一个路由注册中间件,你应该这样做:
Route::get('info', [\App\News::class, 'info'])->middleware(\Path\To\Your\Middleware::class);对于路由组可以这样做:
Route::group(['middleware' => \Path\To\Your\Middleware::class], function() {
Route::get('info', [\App\News::class, 'info']);
});最后,如果你想将一组中间件分配给一条路由,你可以这样做
Route::middleware([\Path\To\Your\Middleware::class])->group(function() {
Route::get('info', [\App\News::class, 'info']);
});你可以在一个组中添加多个中间件,为方便起见,上述示例中只使用了一个。
:::
要注册一个全局中间件,你可以扩展 Cms\Classes\CmsController 或 Backend\Classes\BackendController 控制器类 通过使用以下方法。
public function boot()
{
\Cms\Classes\CmsController::extend(function($controller) {
$controller->middleware(\App\Middleware::class);
});
}另一种方法是,你可以通过 boot() 注册方法直接将其推送到内核中。
public function boot()
{
// Add a new middleware to beginning of the stack.
$this->app[\Illuminate\Contracts\Http\Kernel::class]
->prependMiddleware(\App\Middleware::class);
// Add a new middleware to end of the stack.
$this->app[\Illuminate\Contracts\Http\Kernel::class]
->pushMiddleware(\App\Middleware::class);
}有两种方法可以从路由手动触发 404 错误。首先,你可以使用 abort 辅助函数。abort 辅助函数只是抛出一个带指定状态码的 Symfony\Component\HttpFoundation\Exception\HttpException。
App::abort(404);您也可以手动抛出一个 October\Rain\Exception\NotFoundException 实例。更多关于处理 404 异常以及为这些错误使用自定义响应的信息,可以在文档的 错误与日志 部分中找到。