laravel 路由

分类 Laravel框架学习

2. laravel 路由


2.1. 什么是路由(route)

所谓“路由”,是指把数据从一个地方传送到另一个地方的行为和动作。通常把路由比做桥梁。


2.2. 什么是laravel框架中的路由

通过定义具体的URL,引导浏览器去请求具体的PHP功能代码。在laravel框架中必须先定义路由,再定义该路由对应的功能。


2.3. 为什么使用路由

这种设计符合“单一职责设计原则”。让每个功能都有一个独立的路由对应,当后期有无数个功能模块的时候,通过路由也能清晰的找到每个功能。

注意:在laravel中使用路由必须打开apache的rewrite模块


2.4. 如何定义laravel中的路由


2.4.1. 基本路由

最基本的Laravel路由接收一个URI和一个闭包:

Route::get('/', function () {
    return 'Hello World';
});
Route::post('foo/bar', function () {
    return 'Hello World';
});


大部分路由都定义在被App\Providers\RouteServiceProvider类载入的app/Http/routes.php文件中。


2.4.2. 路由指向控制器与控制器中具体方法


将所有的请求处理逻辑都放在单个 routes.php 中显然是不合理的,你也许还希望使用控制器类组织管理这些行为。控制器可以将相关的 HTTP 请求封装到一个类中进行处理。通常控制器存放在 app/Http/Controllers 目录中。


下面是一个路由指向控制器类的例子。

Route::get('user/{id}', 'UserController@showProfile');


UserController  表示控制器类名 

@ 符号分隔出控制器类名和方法名

showProfile 表示具体的方法名

(有关控制器的知识点,在控制器知识点中具体讲解)


2.4.3. 带参数的路由


    2.4.1必选参数

有时我们需要在路由中捕获URI片段,比如,如果想要从URL中捕获用户ID,可以通过如下方式定义路由参数:

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

可以按需要定义在路由中定义多个路由参数:

Route::get('posts/{post}/comments/{comment}', 
function ($postId, $commentId) {
    //
});

路由参数总是通过花括号进行包裹,参数在路由被执行时会被传递到路由的闭包。

注意:路由参数不能包含“-”字符(减号),需要的话可以使用“_”替代(下划线)。


2.4.2 可选参数

有时候可能需要指定路由参数,并且使得该路由参数是可选的,可以通过在参数名后加一个?来标记:

Route::get('user/{name?}', function ($name = null) {
return $name;
});
Route::get('user/{name?}', function ($name = 'John') {
    return $name;
});


2.4.4. 路由群组

路由前缀


当项目很大时,会定义很多路由,对路由进行分组让程序更加规范易读。

例如:

需要www.xxx.com/user/id 和 www.xxx.com/user/name 这两条路由时


Route::group(['prefix' => 'user'], function () {
    Route::get('id', function ()    {
        Return “user id”;
});
    Route::get('name', function ()    {
        Return “user name”;
    });
});



将两个独立的路由包裹到一个,group的闭包函数中,并且使用['prefix' => 'user'] 来定义该组路由统一的前缀指定命名空间的路由


默认情况下,routes.php中的定义的控制器位于App\Http\Controllers命名空间下。当控制器文件不在该目录时,需要重新指定路由命名空间:


 Route::group(['namespace' => 'NpT'], function(){
    // 控制器在 "App\Http\Controllers\NpT" 命名空间下
        Route::get("test","TController@T");
    }
);

注意:默认情况下,控制器文件都存放在App\Http\Controllers目录或该目录的子目录。