您好,欢迎访问一九零五行业门户网

基于Container Event容器事件的Laravel WEB APP

说明:本文主要讲述laravel容器事件,并更根据容器事件做一个简单demo供加深理解容器事件。同时,作者会将开发过程中的一些截图和代码黏上去,提高阅读效率。
container是laravel框架的核心,container中储存着各种各样的service,并且每一个service通过service provider注册在container里,通过facade模式帮我们从容器里去解析需要的service对象。而这个过程中,容器每一次从容器中解析对象时是会触发一个事件的,可以通过 resolving 方法监听到。实际上在laravel框架中表单请求验证就用到这个好工具,通过一个表单请求类来实现表单内容验证,以免把逻辑放在控制器里弄乱控制器,具体可以看中文文档: 表单请求验证 。关于container event可以看文档: 容器事件 。
container event在表单请求中的应用 先写路由:
route::post('containerevent', 'containereventcontroller@containerevent');route::post('formrequest', 'containereventcontroller@formrequest');route::get('container', 'containereventcontroller@profile');
再建个控制器:
php artisan make:controller containereventcontroller
写上方法:
public function containerevent() { } public function formrequest() { } public function profile() { return view('profile'); }
写上view:
bootstrap template name
age
submit

写个表单请求类:先输入命令生成表单请求类
php artisan make:request containerformrequest
再给出验证规则
class containerformrequest extends request{ /** * determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true;//改为true,这里一般用作用户验证,这里全部通过验证 } /** * get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'name' => 'required', 'age' => 'required|numeric|min:18', ]; }}
修改containereventcontroller:
public function formrequest(containerformrequest $containerformrequest){ dd('this is a from request container event. it is working!!!');}
同时把app/http/kernel.php文件中\app\http\middleware\verifycsrftoken::class注销掉,否则提交表单tokenmismatchexception错误。
好,输入路由(修改为你的路由): http://laravelcontainerevent.app:8888/container ,则输入错误表单会返回到当前表单页面,正确提交输入表单后会打印:
说明fromrequest已经工作了,containerformrequest这个对象从容器中解析的时候,会先工作 authorize 和 rules 方法。而控制器中只需要注入containerformrequest这个对象就行了。
demo 实现一个自定义的类,实现表单提交相同的功能。在app/contracts文件夹中新建eventbeforeresolving.php文件:
namespace app\contracts;interface eventbeforeresolving{ public function isadult();}
并在一个service provider注册下:
//appserviceprovider.php/** * register any application services. * * @return void */ public function register() { //当从容器中解析注入到控制器中前,会先调用实现eventbeforeresolving接口对象的isadult()方法 $this->app->resolving(eventbeforeresolving::class,function($obj, $app){ $obj->isadult(); }); }
写一个service实现这个接口:
//app/services/authorize.phpnamespace app\services;use app\contracts\eventbeforeresolving;use illuminate\http\request;class authorize implements eventbeforeresolving{ private $request; public function __construct(request $request) { $this->request = $request; } public function isadult() { $name = $this->request->input('name'); $age = $this->request->input('age'); if(empty($name) || empty($age) || ($age < 18)){ dd('name and age must be required. and age must be above 18'); } }}
修改下containereventcontroller:
public function containerevent(authorize $authorize) { dd('this is a demo container event. it is working!!!'); }
同时别忘了修改下profile.blade.php文件中表单提交action='/containerevent'。
当输入错误时会提示错误信息:
container event就是在service对象从容器中解析注入前触发事件,可以利用这个功能做一些有趣又好用的好东西呢,比如laravel框架的表单请求验证就是这么做的,这样不会把验证逻辑代码放在控制器中,以免弄乱控制器。
总结:本节主要讲述laravel的容器事件,并以form requet为例说明它的用途,同时以一个小demo讲述怎么一步步建立并监听容器事件。嘛,过两天还想结合laravel的task schedual任务调度新开篇章,到时见。
其它类似信息

推荐信息