路由简单的来说,就是将用户的请求转发给相应的程序进行处理,使用就是建立URL和程序之前的映射。请求类型包括:get、post、put、patch、delete。
1、路由基本使用示例
1.1 默认示例
Laravel中所有路由定义在/routes/web.php文件中,该文件默认定义了应用的首页路由:
Route::get(‘/’, function () {
return view(‘welcome’); }); |
备:域名“laravel.example.com”是通过本机的host文件直接映射的,同时建立了Apache虚拟目录,才实现了这个看似真切的假域名,如下文章都使用了此域名映射,具体映射方法里不进行描述。
这段代码的意思是:当访问应用首页http://laravel.example.com(的时候,返回/resources/views/welcome.blade.php视图中的内容并渲染到浏览器页面中:
以上是应用自带的路由示例,下面我们来自定义一些示例来演示路由的基本使用。
1.2 GET请求路由定义
对页面常见的请求方式有GET和POST,上面这个例子就是使用GET路由的例子,接下里来我们自定义一个/hello请求(代码位置在routes/web.php):
Route::get(‘/hello’,function(){
return “Hello Laravel[GET]!”; }); |
我们在浏览器中输入http://laravel.example.com/hello,以上代码在浏览器中输出:
1.3 POST请求路由示例
然后我们来演示一个POST请求的例子(代码位置在routes/web.php):
Route::get(‘/testPost’,function(){
$csrf_token = csrf_token(); $form = ‘ <form action=”/hello” method=”POST”> <input type=”hidden” name=”_token” value=”{$csrf_token}”> <input type=”submit” value=”Submit”/> </form> ‘; return $form; }); Route::post(‘/hello’,function(){ return “Hello Laravel[POST]!”; }); |
首先我们定义一个/testPost页面用于提交POST请求表单:
在http://laravel.example.com/testpost页面点击“Submit”按钮,页面跳转到http://laravel.example.com/hello并显示:
表明这是通过POST请求访问而非GET请求。
1.4 其它便捷路由定义
还可以使用Route上的match方法匹配多种请求方式(代码位置在routes/web.php):
// match多请求
Route::match([‘get’, ‘post’], ‘/hello’, function() { return “Hello Laravel[match]”; }); |
当然还使用更方便的any方法匹配所有请求方式(代码位置在routes/web.php):
// any匹配所有请求
Route::any(‘/hello’, function() { return “Hello Laravel[any]”; }); |
效果差不多。
2、路由参数使用示例
2.1 必选参数
Route::get(‘/hello/{name}’,function($name){
return “Hello {$name}!”; }); |
在浏览器中访问http://laravel.example.com/hello/Laravel输出:
当然还可以指定多个参数:
Route::get(‘/hello/{name}/by/{user}’,function($name,$user){
return “Hello {$name} by {$user}!”;
});
这样在浏览器中访问http://laravel.example.com/hello/Laravel/by/admin则会输出:
注意以上参数是必选的,如果没有输入参数会抛出MethodNotAllowedHttpException或NotFoundHttpException异常。此外闭包函数中的参数与路由参数一一对应。
2.2 可选参数
有时候我们并不总是想要输入对应参数,也就是说,我们期望参数是可有可无的,我们通过这种方式来定义:
Route::get(‘/hello/{name?}’,function($name=”Laravel”){
return “Hello {$name}!”;
});
我们同时为可选参数指定了默认值,这样当我们访问http://laravel.example.com/hello时输出:
Hello Laravel!
当我们访问http://laravel.example.com/hello/Laravel学院的时候输出:
Hello Laravel学院!
2.3 正则约束
有时候我们希望对路由有更加灵活的条件约束,可以通过正则表达式来实现:
Route::get(‘/hello/{name?}’,function($name=”Laravel”){
return “Hello {$name}!”;
})->where(‘name’,'[A-Za-z]+’);
该条件约束意味着$name参数只能包含大小写字母,如果包含数字或中文就会抛出NotFoundHttpException异常。
如果我们想要在全局范围内对参数进行条件约束,可以在RouteServiceProvider的boot方法中做如下定义:
public function boot(Router $router)
{
$router->pattern(‘name’,'[A-Za-z]+’);
parent::boot($router);
}
我们访问http://laravel.example.com/hello/Laravel123/by/Laravel学院时一样会抛出NotFoundHttpException异常。这意味着boot方法定义的参数条件约束将会应用到所有包含该参数的路由中。
此外,服务提供者的boot方法在所有服务提供者的register方法执行完毕后开始执行,也就是说,我们可以在boot方法对任意服务容器中的对象进行依赖注入。
评论(1)
到你的博客走一趟,如同阳光洒在我脸上,心里暖洋洋!