琯琯博客 纸上得来终觉浅,绝知此事要躬行。

Laravel 系列教程(四)路由

琯琯
2018-01-05

文章开始前先说个前提;

这个系列的文章我都会把控制器按模块划分了;

示例都是在模块的基础上讲解的;

关于模块先参考上篇文章;

写给 thinkphp 开发者的 laravel 系列教程 (三) 目录结构

正文开始;

如果我们想访问 Admin 模块下的 IndexController 控制器的 index 方法;

在 thinkphp 中是不需要手动定义的;

这根本不算是一个问题;

直接访问 https://baijunyao.com/Admin/Index/index 即可;

而 laravel 则需要在routes/web.php 文件中定义如下:

Route::get('admin/index/index', 'Admin\IndexController@index');

每写一个方法就要定义一条路由;

从 thinkphp 转到 laravel 的筒子们;

路由是一个必定产生疑惑的地方;

laravel 整天标榜这自己优雅;

这 thinkphp 中都自动完成的东西;

laravel 还需要手动写一大串;

这到底哪优雅了;

我是一个懒人;

当我知道了我要写那么多路由;

我是拒绝的;

于是我一度在研究如何让 laravel 也像 thinkphp 那么实现自动路由;

终于皇天不负苦心人;

我搞定了这件事;

如果你也是和我一样的懒人;

那么恭喜你;

等我下面给出解决的方案吗? NO;NO;NO; 我并不打算教你;

因为我在使用 laravel 的过程中;

不断的感受到了 laravel 对于解耦的执着;

当我重构几次项目后;

就理解到了这种自定义路由的灵活;

把上面这堆水拧干了;

核心就是想说服已经习惯 thinkphp 路由的童鞋们接受并使用路由;

但是如果都像上面那样一条一条定义路由;

Route::get('admin/article/index', 'Admin\ArticleController@index');
Route::get('admin/article/create', 'Admin\ArticleController@create');
Route::post('admin/article/store', 'Admin\ArticleController@store');

想想也是挺心累的;

那我这里利用 group prefix 让路由更简洁和更有层级感了;

可以实现像 thinkphp 那样的 模块/控制器/方法三级;

给出一个示例;

// Admin 模块
Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'middleware' => 'admin.auth'], function () {
    // 文章管理
    Route::group(['prefix' => 'article'], function () {
        // 文章列表
        Route::get('index', 'ArticleController@index');
        // 发布文章
        Route::get('create', 'ArticleController@create');
        // ...
    });

    // 分类管理
    Route::group(['prefix' => 'category'], function () {
        // 分类列表
        Route::get('index', 'CategoryController@index');
        // 添加分类
        Route::get('create', 'CategoryController@create');
    });
});

上面代码中的 namespace 就是相对于 app/Http/Controllers 的命名空间;

路径为 app/Http/Controllers/Admin 的admin模块的 namespace 就是Admin了;

prefix 就是定义 url 中模块和控制器的名字了;

middleware 是中间件;

这里不多说; 后续文章将持续讲解;

所以上面示例中定义的 url 分别是;

admin/article/index
admin/article/create
admin/category/index
admin/category/create

还是原来的配方; 熟悉的味道;

这样是不是既符合已有的 thinkphp 习惯;

又不违反 laravel 的规则;

在url中相比 thinkphp laravel还多出了个路由参数的概念;

但是因为要在控制器中获取值;

所以我放在了下一篇文章讲解控制器的时候一起讲了;

(完)

原文链接


相关文章

评论

内容导航