路由由后端控制器自动处理,而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::route 方法生成 URL 或重定向时使用该路由的名称:
$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 并附带指定的 HTTP 状态码。
App::abort(404);您还可以手动抛出一个 October\Rain\Exception\NotFoundException 实例。更多关于处理 404 异常以及为这些错误使用自定义响应的信息,可以在文档的 错误与日志 章节中找到。