Laravel自动路由

貌似没什么人看。。。

Posted on October 7, 2016 in Laravel

https://www.zhihu.com/question/30279133/answer/121835605

首先,Laravel 是有自动路由的,见 HTTP Controllers ,可以用

Route::controller('prefix', 'XxxController');

的方式按规则自动调用指定controller的方法。 如果决定这还不够自动,可以这样在route.php这样写:

Route::pattern('path', '.+');

Route::any('/{path}', function (Request $request, $path) {
    $auto = explode('/', $path);
    $controller = ucfirst($auto[0]);
    $function = $auto[1];
    $params = key_exists(2, $auto) ? array_slice($auto, 2) : '';
    $params = implode(',', array_map('addWrapper', $params)) ;
    $method = strtolower($request->method());
    eval("$controller = new App\Http\Controllers\{$controller}Controller;$controller->{$function}_{$method}({$params});");
});

function addWrapper($param)
{
    return is_numeric($param) ? $param  : "'" . $param . "'";
}

然而,第一个方法在最新的5.3的文档中已经找不到了,这说明自动路由其实是不被推荐的,部分原因可以看 Beware the Route to Evil 。主要是,你想过接手别人的项目,要一个一个地翻controller才能知道哪个route调用哪个方法的痛苦吗orz

这个时候Laravel的强大之处就体现出来了,比如我暑假做的一个外包的route:

Route::group(['prefix' => 'course', 'namespace' => 'Course'], function () {

        Route::post('management/uploadImg', 'ManagementController@uploadImg');
        Route::get('school/{school_id}/management/show', 'ManagementController@show');
        Route::get('school/{school_id}/management/check/{name}', 'ManagementController@check');

        Route::post('school/{school_id}/arrangement/show', 'ArrangementController@show');

        Route::post('coach/uploadImg', 'CoachController@uploadImg');

        // 教练是否重名
        Route::get('coach/dose-name-exist/{name}', 'CoachController@doesNameExist');

        // restful
        Route::resource('school.management', 'ManagementController', ['except' => ['edit', 'create', 'show']]);
        Route::resource('school.arrangement', 'ArrangementController', ['except' => ['edit', 'create', 'show']]);
        Route::resource('school.coach', 'CoachController', ['except' => ['create', 'edit']]);
    });

什么样的url,调用了哪个controller的哪个方法,一目了然,再加上restful,整个route就显得十分优雅。 Laravel的另一个强大之处在于它的Eloquent ORM解决了项目中经常遇到的模型关系问题,这里不展开讲,可以看 Eloquent: Getting Started ,5.3也发布了很多很有趣的新特性,可以看 Release Notes 至于Laravel是否优雅,我觉得这是个很主观的问题。有些人会觉得thinkphp的暴露是一种优雅,有的人觉得完善的封装才是优雅,我觉得没有必要谁说服谁。同理,Laravel这么多功能,有的人用到了,觉得强大;有的人没用到,觉得臃肿,没什么好争的。 Laravel是我用过的第一个php框架,当时大一下部门作业要求学mvc,我看了thinkphp的文档,看不懂,又看了codeigniter,还是看不懂,最后看了Laravel,卧槽这才是最符合人类书写方式的框架好吗。。。于是就跳了Laravel的坑 (:з」∠)