HTTP路由实例教程(一)—— 基本使用及路由参数

1、路由基本使用示例

1.1 默认示例

Laravel中所有路由定义在/app/Http/routes.php文件中,该文件默认定义了应用的首页路由:

Route::get('/', function () {
    return view('welcome');
});

这段代码的意思是:当访问应用首页http://laravel.app:8000(使用Homestead虚拟机作为开发环境)的时候,返回/resources/views/welcome.blade.php视图中的内容并渲染到浏览器页面中:

Laravel自带示例首页

以上是应用自带的路由示例,下面我们来自定义一些示例来演示路由的基本使用。

1.2 GET请求路由定义

对页面常见的请求方式有GET和POST,上面这个例子就是使用GET路由的例子,接下里来我们自定义一个/hello请求:

Route::get('/hello',function(){
    return "Hello Laravel[GET]!";
});

我们在浏览器中输入http://laravel.app:8000/hello,以上代码在浏览器中输出:

Hello Laravel[GET]!

1.3 POST请求路由示例

然后我们来演示一个POST请求的例子:

Route::get('/testPost',function(){
    $csrf_token = csrf_token();
    $form = <<<FORM
        <form action="/hello" method="POST">
            <input type="hidden" name="_token" value="{$csrf_token}">
            <input type="submit" value="Test"/>
        </form>
FORM;
    return $form;
});

Route::post('/hello',function(){
    return "Hello Laravel[POST]!";
});

首先我们定义一个/testPost页面用于提交POST请求表单,在http://laravel.app:8000/testPost页面点击“Test”按钮,页面跳转到http://laravel.app:8000/hello并显示:

Hello Laravel[POST]!

表明这是通过POST请求访问而非GET请求。

1.4 其它便捷路由定义

还可以使用Route门面上的match方法匹配多种请求方式:

Route::match(['get','post'],'/hello',function(){
   return "Hello Laravel!";
});

当然还使用更方便的any方法匹配所有请求方式:

Route::any('/hello',function(){
    return "Hello Laravel!";
});

效果都一样。

2、路由参数使用示例

2.1 必选参数

Route::get('/hello/{name}',function($name){
    return "Hello {$name}!";
});

在浏览器中访问http://laravel.app:8000/hello/Laravel输出:

Hello Laravel!

当然还可以指定多个参数:

Route::get('/hello/{name}/by/{user}',function($name,$user){
    return "Hello {$name} by {$user}!";
});

这样在浏览器中访问http://laravel.app:8000/hello/Laravel/by/Laravel学院则会输出:

Hello Laravel by Laravel学院!

注意以上参数是必选的,如果没有输入参数会抛出MethodNotAllowedHttpExceptionNotFoundHttpException异常。

此外闭包函数中的参数与路由参数一一对应。

2.2 可选参数

有时候我们并不总是想要输入对应参数,也就是说,我们期望参数是可有可无的,我们通过这种方式来定义:

Route::get('/hello/{name?}',function($name="Laravel"){
    return "Hello {$name}!";
});

我们同时为可选参数指定了默认值,这样当我们访问http://laravel.app:8000/hello时输出:

Hello Laravel!

当我们访问http://laravel.app:8000/hello/Laravel学院的时候输出:

Hello Laravel学院!

2.3 正则约束

有时候我们希望对路由有更加灵活的条件约束,可以通过正则表达式来实现:

Route::get('/hello/{name?}',function($name="Laravel"){
    return "Hello {$name}!";
})->where('name','[A-Za-z]+');

该条件约束意味着$name参数只能包含大小写字母,如果包含数字或中文就会抛出NotFoundHttpException异常。

如果我们想要在全局范围内对参数进行条件约束,可以在RouteServiceProviderboot方法中做如下定义:

public function boot(Router $router)
{
    $router->pattern('name','[A-Za-z]+');
    parent::boot($router);
}

我们访问http://laravel.app:8000/hello/Laravel123/by/Laravel学院时一样会抛出NotFoundHttpException异常。这意味着boot方法定义的参数条件约束将会应用到所有包含该参数的路由中。

此外,服务提供者boot方法在所有服务提供者的register方法执行完毕后开始执行,也就是说,我们可以在boot方法对任意服务容器中的对象进行依赖注入。

学院君 has written 1043 articles

Laravel学院院长,终身学习者

积分:125947 等级:P12 职业:手艺人 城市:杭州

32 条回复

  1. 超人不会飞 超人不会飞 says:
    在RouteServiceProvider的boot方法中配置全局范围内对参数进行条件约束报错 Declaration of App\Providers\RouteServiceProvider::boot(App\Providers\Router $router) should be compatible with Illuminate\Foundation\Support\Providers\RouteServiceProvider::boot() 请问怎么回事呢,谢谢!
  2. 猪刚鬣 猪刚鬣 says:
    版本5.2.45用hello报404是什么原因,不是在routes.php里改的吗
  3. laravelTest laravelTest says:
    @ 干活就是牛 你的事最新版本吧?最新版本确实不可以,我之前在5.4上运行不可以,换为5.1后就没有问题了
  4. 天南韩立 天南韩立 says:
    Laravel框架5.4.15这个版本没有/app/Http/routes.php文件。 对应的文件为\routes\web.php。
  5. 齐俊杰 齐俊杰 says:
    Laravel Framework 5.4.15没有/app/Http/routes.php文件。 对应的文件为blog\routes\web.php。
  6. 追梦 追梦 says:
    @ 干活就是牛 入口文件index.php默认在public目录下, host主机/public/hello 即可访问
  7.  Monster.  Monster. says:
    @ 学院君 你好可爱啊~ 你的地址/hello 这个才对 学院君是自己配的虚拟或者应用地址

登录后才能进行评论,立即登录?