Laravel 基础操作
首先,我是一个小白,纯小白,接触Laravel
不到一周,所以接下来的内容基本浅显易懂到只要你认识中文的程度。
其次,我使用的Laravel
版本是5.4.*。下面的例子中的文件路径,设置方法都是采用该版本的。
再有,接下来提及的文档,指的是Laravel 5.4 中文文档
运行流程
当然不是真的Laravel
内部核心代码运行流程,而是针对我们开发者来说,如何操作Laravel
。
- 设置路由
- 创建对应路由器
- 如果需要,创建对应模型
- 输出到页面
也就是路由=>C=>M=>V
。还有!!!最好使用PHPStorm
作为开发IDE,否则你会在各种命名空间中排查一堆问题。
下面正式开始!
路由
路由设置
路由文件是/routes/web.php
文件,其中路由的设置方法参考文档的介绍有以下几种:
路由基本格式
//拿下面这个作为一个例子
Route::get('/welcome',function(){
return view('welcome');
});
get
,请求类型,具体的类型下面会介绍'/welcome'
,URL,假设你配置的域名为www.laravel.com
,那么当你访问www.laravel.com/welcome
时,就会对应到这个路由function(){//code...}
,对应该路由的闭包函数,但是也可以在这里指定控制器与该控制器下的方法,下面会演示的。
请求类型
先说一些前缀知识,我也是刚百度来的,Http请求
不止有我们熟悉的get post
,还有put patch delete options
。其中各种请求的简单介绍如下:
请求名称 | 作用 |
---|---|
get | 请求资源 |
post | 更新全部资源 |
put | 更新部分资源 |
patch | 更新部分资源 |
delete | 删除资源 |
options | 可以使用使用的功能选项 |
其中浏览器只支持get post
,所以我们最常见的就是这两种。但是Laravel
的路由设置中,是可以设置剩余的方法的,但是这种设置不是真的发送一个这种类型的请求,而是在表单中加入特定的hidden字段,从而模拟这种请求。具体的做法就是在表单中使用内置的模板{{method_field("put")}}
,这样就会生成一个input hidden
的字段,并且把该表单交给Laravel
,则会当作put
请求一样处理,同理delete patch options
也是一样的。
提到表单,为了保证CSRF防护,(别问我设置什么,我要是懂了的话,那估计就危险了,所以呈上百度百科)。
所以在提交给Laravel
的form
中必须加入{{csrf_field()}}
,这个会在模板中渲染出一个令牌,后台根据该令牌,决定是否处理该请求。
路由参数
直接看路由的代码吧:
//注意,如果这里是直接在路由中进行处理的话,那么一定要在function()中显式的将参数传递进去
Route::get("user/{id}",function($id){
return $id;
})
//当然,上面只是传递了一个参数,可以传递多个参数
Route::get("user/param1/{param1}/param2/{param2}",function($param1,$param2){
return $param1." ".$param2;
});
//上面的路由参数是一定要有的,但是有时候我们不确定是否有该参数,那么可以使用下面的形式
Route::get("user/{name?}",function($name=='default value'){
//注意,一定要在闭包函数内部设置默认值,保证即使该数据没有传递过来,也可以进行对应处理
});
参数正则验证
//使用where在路由中进行正则约束
Route::get('user/{id}',function(){})->where('name','[0-9]+');
全局路由正则验证
上面的参数正则验证是针对每一个路由进行设置的,但是如果想对同一个参数设置全局的验证,比如用户的id一定要为数字,则可以在/app/Providers/RouteServiceProvider.php
中的boot()
方法中进行设置。下面是官网给出的一个例子:
public function boot(){
Route::pattern('id','[0-9]+');
parent::boot();
}
当设置了上面的验证后,下次这样的路由访问,会自动进行正则的验证:
Route::get('user/{id}',function(){});
路由命名
为什么要使用路由命名
在介绍原因之前,先介绍一个很好用的函数:route('RouteName',array('paramName'=>'paramValue'))
,这个函数很像tp中的U()
函数,也是用来生成URL地址的。其中的RouteName
参数就是这里设置的路由命名。
具体设置方法
Route::get('users/create',function(){
return view('users.create');
})->name('login');
下面就能使用route('login')
,直接输出该URL地址。
路由群组
这玩意有什么用呢???比如你想为多个路由设置统一的配置,那么就可以使用该设置。具体内容可以看下面。
中间件设置
比如都需要相同的中间件进行审核(中间件的知识后面会介绍的,或者可以看我这篇博客)。那么可以统一进行设置:
Route::group(['middleware'=>'Admin'],function(){
Route::get('/',function(){});
Route::post('/',function(){});
});
上面这样的配置中,当你无论以get
还是post
都的方式访问/
,都会经过Admin
中间件的审核。
命名空间
这里先介绍一下如何在路由设置中调用控制器,以及该控制器下对应的方法:
Route::get('login','UsersController@create');
上面代码调用控制器UsersController
,并且是该控制器下的create
方法。调用其中的UsersController
默认的命名空间是App\Http\Controllers
。但是也可以额外进行设置:
Route::group(['namespace'=>'Admin'],function(){
//这里的UsersController的命名空间就是Admin
Route::get('login','UsersController@create');
});
子域名路由
文档上还介绍了可以设置子域名。设置方式如下:
Route::group(['domain'=>"{account}.newUrl.com"],function(){
Route::get('users',function(){});
Route::post('users',function(){});
});
路由前缀
比如我要访问这么多个路由:admin/users/create
,admin/users/store
,’admin/users/update’,为了把代码弄的简洁一点,那么可以设置如下的形式:
Route::group(['prefix'=>'admin'],function(){
Route::get('users/create',function(){});
Route::post('users/store',function(){});
Route::post('users/update',function(){});
});
路由模型绑定
上面我们在路由中调用了控制器与该控制器下的方法,但是实际上还可以直接调用模型,我只能说Laravel
你厉害!
隐式绑定
Route::get('users/{user}',function(App\User $user){
//code
});
这里牵扯的知识点有几个,先介绍一下:
- 根据上面的介绍
{user}
代表的是参数,这里只是把变量名命名为user
,为了和后面的App\User
对应 App\User
对应的Laravel中的Model的命名空间,在Laravel中,Model类都是直接采用数据库表名为文件名,创建在app\
目录下的,并且设置App\
加上文件名作为命名空间。
上面这样创建之后,当你访问users/1
时,会自动实例化一个User模型类,并传递进入参数。
显示绑定
上面的隐式绑定要求参数名和表名结构是一致的,也就是Laravel在猜。如果要百分百确定的话,可以直接在/app/Providers/RouteServiceProvider.php
中的boot()
方法中进行设置:
public function boot(){
parent::boot();
Route::model('user',App\User::class);
}
在路由文件中设置下面形式时:
Route::get("admin/{user}",function(App/User $user){
//这里就会明确生成一个App/User类
});
自定义处理逻辑
还是上面的/app/Providers/RouteServiceProvider.php
中的boot()
方法,可以在里面这样设置:
public function boot(){
parent::boot();
Route::bind('user',function($value){
return App/User::firstOrFail($value);
});
}
路由相关参数
在其他地方可以调用下面的Api进行查询当前路由的信息:
$route=Route::current();
$name=Route::currentRouteName();
$action=Route::currentRouteAction();
顺道一提,Route
的命名空间是use Illuminate\Routing\Router;