Learning laravel:路由

参考文档:https://d.laravel-china.org/docs/5.5/routing

路由

路由(route)文件存放在 routes 文件夹下,新建项目中已有 4 个默认的路由文件,初学基本只接触 web.php ,该文件中已定义了一条路由:

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

我们在浏览器中通过 URL 访问以上路由:homestead 环境: learning-laravel-demo.app/index.php/ ,
WampServer 环境: localhost/learning-laravel-demo/public/index.php/, 呈现欢迎页(welcome),后面只说 homestead 环境下的访问。

其中 learning-laravel-demo.app/index.php 是为访问入口(文件目录地址:public/index.php),而后面的 / 则是路由中定义的路径,该路由中的方法直接返回 welcome 视图(view)。

由于项目中添加了web 服务器重写(rewrite)规则:public/.htaccess(这是 Apache 服务器的重写规则),我们可以去掉 index.php,因此访问路径可写作: learning-laravel-demo.app/,而/表示的是根路径(uri),也可以去掉,简单写作learning-laravel-demo.app

路由器允许你注册能响应任何 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 请求中会同时包含 POSTGET 请求,于是又有如下方法:

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

Route::any('foo', function () {
    //
});

以上只是路由的基本形式,但是我们实际的项目中不可能像默认的那样只返回一个静态页面,我们需要调用控制器(controller)中的方法(function)动态渲染视图(view),因而我们需要建立urlcontrollerfunction 的映射。

假如控制器如下所示:

class TestController extends Controller{
        //get
        public function index(){}
        //post
        public function store(Request $request){}
}

那么则可以如下定义路由:

Route::get('test/index','TestController@index');
Route::post('test/store',"TestController@store");

访问的 URL 则是:learning-laravel-demo.app/test/indexlearning-laravel-demo.app/test/store

路由参数

路由中也可以定义参数,比如我们要根据 id 显示内容:

class TestController extends Controller{
        ......

        //get
        public function show($id){}
}
Route::get('test/{id}','TestController@show');

URL: learning-laravel-demo.app/test/1

路由参数可以有多个。

路由命名

命名路由可以方便地为指定路由生成 URL 或者重定向。通过在路由定义上链式调用 name 方法指定路由名称:

Route::get('test/index','TestController@index')->name('test.index');
Route::post('test/store',"TestController@store")->name('test.store');
Route::get('test/{id}','TestController@show')->name('test.show')

然后便可通过全局辅助函数 route 来生成链接或者重定向到该路由:

//生成链接
$url = route('test.index');
//重定向
return redirect()->route('test.index');

//如果有路由参数时:
$url = route('test.show',[$id=>1]);

路由分组

中间件:

要给路由组中所有的路由分配中间件,可以在 group 之前调用 middleware 方法.中间件会依照它们在数组中列出的顺序来运行:

Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // 使用 first 和 second 中间件
    });

    Route::get('user/profile', function () {
        // 使用 first 和 second 中间件
    });
});

命名空间:

假如我们要做前后台分件分离,我们在 Controllers 文件夹下新建了 Admin 文件夹,用来存放后台相关的控制器:

namespace App\Http\Controllers\Admin;

class Test2Controller extends Controller{
    public function index(){}
}

那么定义路由:

Route::get('test2/index','Admin\TestController@index')->name('test2.index');

如果有很多条路由会很繁琐,可以简化如下:

Route::namespace('Admin')->group(function () {
    Route::get('test2/index','Test2Controller@index')->name('test2.index');
});

路由前缀:

假如我们希望前后台不同也在 URL 体现出来,用上面的例子,可以如下定义路由:

Route::namespace('Admin')->group(function () {
    Route::get('admin/test2/index','Test2Controller@index')->name('test2.index');
});

如果有很多条路由依然会很繁琐,可以简化如下:

Route::namespace('Admin')->group(function () {
    Route::prefix('admin')->group(function () {
        Route::get('test2/index','Test2Controller@index')->name('test2.index');
    });
});

上面路由还可以简化如下:

Route::group(['prefix'=>'admin', 'namespace'=>'Admin'], function(){
    Route::get('test2/index','Test2Controller@index')->name('test2.index');
}

访问 http://learning-laravel-demo.app/admin/test2/index

其他细节请参考文档。


更多内容,敬请期待!

转载请注明出处:https://www.hellocode.wang/article/learning-laravel-route

评论