教程 > laravel 教程 > 阅读:112

laravel 路由——迹忆客-ag捕鱼王app官网

路由基本用法

最基本的laravel路由接受一个uri和一个closure,提供了一种非常简单且富有表现力的方法来定义路由:

route::get('foo', function () {
    return 'hello world';
});

默认路由文件

所有laravel路由都在路由文件中定义,这些文件位于routes目录中。 这些文件由框架自动加载。 route/web.php文件定义了用于web界面的路由。 这些路由被分配了web中间件组,该组提供了会话状态和csrf保护等功能。 route/api.php中的路由是无状态的,并分配了api中间件组。

对于大多数应用程序,首先在routes/web.php文件中定义路由。 可以通过在浏览器中输入定义的路由的url来访问route/web.php中定义的路由。 例如,可以通过在浏览器中导航栏中输入http://your-app.test/user 来访问以下路由:

route::get('/user', 'usercontroller@index');

route / api.php文件中定义的路由是由routeserviceprovider嵌套在路由组内。 在此组中,/api uri前缀是自动应用的,因此无需手动将其应用于文件中的每个路由。 我们可以通过修改routeserviceprovider类来修改前缀和其他路由组选项。

定义路由执行的方法

路由器允许注册响应任何http动词的路由:

route::get($uri, $callback);
route::post($uri, $callback);
route::put($uri, $callback);
route::patch($uri, $callback);
route::delete($uri, $callback);
route::options($uri, $callback);

有时可能需要注册一个响应多个http动词的路由。 我们可以使用match方法。 或者,甚至可以使用any方法注册一个响应所有http动词的路由:

route::match(['get', 'post'], '/', function () {
    //
});
route::any('/', function () {
    //
});

csrf 保护

在web路由文件中定义的指向post,put,patch或delete路由的任何html表单都应包含csrf token字段。 否则,该请求将被拒绝。 我们可以在csrf文档中阅读有关csrf保护的更多信息:

@csrf ...

重定向路由

如果要定义重定向到另一个uri的路由,则可以使用route::redirect方法。 此方法方便快捷,因此我们不必为执行简单的重定向而定义完整的路由或控制器:

route::redirect('/here', '/there');

默认情况下,route::redirect返回302状态代码。 我们可以使用可选的第三个参数来自定义状态代码:

route::redirect('/here', '/there', 301);

我们可以使用route::permanentredirect方法进行重定向,该方法默认返回301状态代码:

route::permanentredirect('/here', '/there');

视图路由

如果我们的 route 仅需要返回视图,则可以使用route::view方法。 与重定向方法一样,此方法提供了一个简单快捷的方式,因此我们不必定义完整的路由或控制器。 view方法接受uri作为其第一个参数,并接受视图名称作为其第二个参数。 另外,可以提供一个数据数组作为可选的第三个参数传递给视图:

route::view('/welcome', 'welcome');
route::view('/welcome', 'welcome', ['name' => 'taylor']);

路由参数

必须的参数

有时,需要捕获路由内的uri段。 例如,我们可能需要从url中捕获用户的id。 可以通过定义路由参数来做到这一点:

route::get('user/{id}', function ($id) {
    return 'user '.$id;
});

可以根据自己的需求定义任意数量的参数:

route::get('posts/{post}/comments/{comment}', function ($postid, $commentid) {
    //
});

路由的参数始终用{}大括号括起来,并且应由字母字符组成,并且不能包含-字符。 可以使用下划线(_)代替 -。 路由参数根据其顺序注入到路由回调函数或者控制器中——回调函数或者控制器参数的名称无关紧要。

可选参数

有时,我们可能需要指定一个路由参数,但是该路由参数是可选的,也就是说我们在客户端请求的时候可以不传该参数。 我们可以通过放置一个问号 在参数名称后进行标记。 确保为路由的相应变量赋予默认值:

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] ']);

全局约束

如果希望始终由给定的正则表达式约束route参数,则可以使用pattern方法。 应该在routeserviceproviderboot方法中定义以下模式:

/**
 * define your route model bindings, pattern filters, etc.
 *
 * @return void
 */
public function boot()
{
    route::pattern('id', '[0-9] ');
    parent::boot();
}

定义模式后,将使用该参数名称将其自动应用于所有路由:

route::get('user/{id}', function ($id) {
    // only executed if {id} is numeric...
});

编码斜杠 /

laravel路由组件允许除/之外的所有字符。 必须使用where条件中的正则表达式明确允许/成为占位符的一部分:

route::get('search/{search}', function ($search) {
    return $search;
})->where('search', '.*');

警告:仅在最后一个路由段内支持编码的斜杠。


命名路由

通过命名路由,可以方便地生成url或特定路由的重定向。 可以通过将name方法链接到路由定义上来为路由指定名称:

route::get('user/profile', function () {
    //
})->name('profile');

还可以为控制器操作指定路由名称:

route::get('user/profile', 'userprofilecontroller@show')->name('profile');

路由的名称必须是唯一的

由名称获取路由的url

为给定的路由分配名称后,可以在生成url或通过全局路由功能重定向时使用该路由的名称:

// 生成 urls...
$url = route('profile');
// 重定向...
return redirect()->route('profile');

如果命名的路由定义了参数,则可以将参数作为第二个参数传递给route函数。 给定的参数将自动在正确的位置插入url:

route::get('user/{id}/profile', function ($id) {
    //
})->name('profile');
$url = route('profile', ['id' => 1]);

如果在数组中传递其他参数,则这些键/值对将自动添加到生成的url的 query 中,作为请求的参数:

route::get('user/{id}/profile', function ($id) {
    //
})->name('profile');
$url = route('profile', ['id' => 1, 'photos' => 'yes']);

有时,我们可能希望为url参数指定请求范围的默认值,例如当前语言环境。 为此,可以使用url::defaults方法。

检查当前路由

如果想确定当前请求是否被路由到指定名称的路由,则可以在route实例上使用named方法。 例如,我们可以从路由中间件检查当前路由名称:

/**
 * handle an incoming request.
 *
 * @param  \illuminate\http\request  $request
 * @param  \closure  $next
 * @return mixed
 */
public function handle($request, closure $next)
{
    if ($request->route()->named('profile')) {
        //
    }
    return $next($request);
}

查看笔记

扫码一下
查看教程更方便
网站地图