学习Laravel快一年,从对这个框架陌生到慢慢熟悉经历了一个过程,laravel是一个非常全面的框架,包含了Vue.js,PHPUnit,SASS,Redis,广播等很多组件,借鉴了Spring的IOC服务容器,使用绑定实现模块化解耦。
相对于轻量级的ThinkPHP,开始上手Laravel很不习惯,尤其是手册写的晦涩难懂,经过漫长的学习过程,看了很多视频教程,通过自己一步步练习才理解,我在这里分享下自己的经验。
路由
简单理解就是当用户输入一个 Http地址,如何找到对应的控制器和传递参数,ThinkPHP一般不用考虑,因为按照 模块名/控制器名/方法名 自动解析URL,所以一开始我也不理解为什么要画蛇添足, 这样每个外部访问的方法都需要麻烦添加路由,其实因为Laravel的入口是按 REST原则 工作的。
路由文件的位置,5.4以下版本在 app\Http\routes.php,新版本在根目录 routes 文件夹。
Laravel手册这么定义一个最简单的路由。
Route::get('/', function () {
return view('welcome');
});
看到这里不要懵逼,这种写法是一个闭包,好处是把回调的实现和使用场所隔离,这段代码是意思是,当get方式访问根目录时返回welcome视图,也可以通过
Route::get('admin/info','Admin\IndexController@info');
访问http://your-app.dev/admin/info时,调用命名空间Admin下的IndexController控制器里的info方法。这样写是不是麻烦,所以有了路由组,统一指定中间件,前缀和命名空间。
Route::group(['middleware' => ['web','admin.login'], 'prefix'=>'admin',
'namespace'=>'Admin'], function () {
Route::get('info','IndexController@info');
});
一个好处是可以在路由层过滤输入参数,如用正则表达式规定id为数字。
Route::get('user/{id}', function ($id) {
return 'User '.$id;
})->where('id', '[0-9]+');
路由不光要指定路径,还要指定get post any match等不同的获取方式,可以使用资源路由简化。
Route::resource('article','ArticleController');
相当于定义了7条路由,但是要按照指定方法访问,而HTTP表单不支持put patch和delete行为,所以需要增加一个隐藏的标签。这种方法因为可能影响同控制器定义的其他路由,所以不建议使用。
<form action="/foo/bar" method="POST">
@method('PUT') //相当于 <input type="hidden" name="_method" value="PUT">
@csrf
</form>
以上就是最基础的使用,手册上还有重定向、别名、生成URL、子域名、绑定模型、限流等功能。