文档章节

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

botkenni
 botkenni
发布于 2016/10/11 10:05
字数 1122
阅读 60
收藏 2

说明:本文主要讲述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:

<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
        <title>Bootstrap Template</title>
        <!-- 新 Bootstrap 核心 CSS 文件 -->
        <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
        <style>
            html,body{
                width: 100%;
                height: 100%;
            }
            *{
                margin: 0;
                border: 0;
            }
        </style>
    </head>
    <body>
        <div class="container">
            <div class="row">
                <div class="col-xs-12 col-md-12">

                    <form action="/formrequest" method="post" accept-charset="UTF-8" enctype="multipart/form-data">
                        <div class="form-group">
                            <label for="name">Name</label>
                            <input type="text" class="form-control" id="name" name="name" placeholder="Name">
                        </div>
                        <div class="form-group">
                            <label for="age">Age</label>
                            <input type="text" class="form-control" id="age" name="age" placeholder="Age">
                        </div>
                        <button type="submit" class="btn btn-default">Submit</button>
                    </form>

                </div>
            </div>
        </div>

        <!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
        <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
        <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
        <script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
        <script>

        </script>
    </body>
</html>

写个表单请求类:先输入命令生成表单请求类

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这个对象从容器中解析的时候,会先工作authorizerules方法。而控制器中只需要注入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.php
namespace 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 Scheduler任务调度新开篇章,到时见。

© 著作权归作者所有

共有 人打赏支持
botkenni
粉丝 20
博文 409
码字总数 434882
作品 0
西城
程序员
私信 提问
laravel 源码解析

入口文件 index.php IlluminateFoundationApplication 类 注入所有基础 Service Provider 入口文件 index.php 一个基于Laravel的应用,当WEB服务器接受到来自外部的请求后,会将这个这个请求...

晓菲
2016/02/26
107
0
Laravel框架一:原理机制篇

http://www.cnblogs.com/XiongMaoMengNan/p/6644892.html Laravel作为在国内国外都颇为流行的PHP框架,风格优雅,其拥有自己的一些特点。 一. 请求周期   Laravel 采用了单一入口模式,应用...

hisense20112784
2017/08/11
0
0
基于 Pusher 驱动的 Laravel 事件广播(上)

说明:本文主要来源于Building Real-Time Laravel Apps with Pusher。 本文主要介绍使用Pusher包来开发带有实时通信功能的Laravel APP,整个教程只需要两个小时就能顺利走一遍。同时,作者会...

botkenni
2016/10/10
65
0
Laravel 5.0 的新特性

原文: http://laravel.com/docs/master/releases#laravel-5.0 译文: http://discuss.flarum.org.cn/24-laravel-5 译者: flarum Laravel 5.0 包括超过 22 个新特性。 Laravel 5.0 引入了一......

justjavac
2015/02/09
965
5
基于Model Event模型事件的Laravel实时APP

说明:本文主要来源于real-time-apps-laravel-5-1-event-broadcasting 本文主要基于Laravel的Model Event介绍该框架的实时通信功能,Laravel模型的生命周期中包含事件:、、、、,、、、、,同...

botkenni
2016/10/11
23
0

没有更多内容

加载失败,请刷新页面

加载更多

如何高效地遍历 MongoDB 超大集合?

GitHub 仓库:Fundebug/loop-mongodb-big-collection 本文使用的编程语言是 Node.js,连接 MongoDB 的模块用的是mongoose。但是,本文介绍的方法适用于其他编程语言及其对应的 MongoDB 模块。...

Fundebug
21分钟前
1
0
把自己的代码发布到CocoaPods上

由于多个项目用到同一个功能,所以想把该功能模块化 主要参考了这篇文章:自己的库上传到pod详细步骤 不过还是遇到很多坑。 1,先在GitHub上创建一个仓库。比如我创建了一个PPodTest 2, 克隆...

山里来的
28分钟前
2
0
[activiti6]在springboot增加restful api服务

<activiti.version>6.0.0</activiti.version>... <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-rest</artifactId> ......

Danni3
35分钟前
0
0
毕业季,我的Linux求职之路

毕业季,我的Linux求职之路 秋招终于告一段落了,本硕的七年求学之路也快画上了句号。回首求职的这一段日子,痛苦并快乐着。感谢所有陪伴着我走过这一段路程的同学,所有的辛酸都值得铭记。求...

linuxCool
38分钟前
0
0
PHP教程中验证正整数is_int($value+0),为什么要这样?

最近学习PHP应用,其中有一段是要验证变量是否为正整数,除了is_numeric($value)外,还要加上is_int($value+0)且($value+0) > 0,为什么还要 +0呢?直接验证$value不行吗? ,只要 is_int($...

dragon_tech
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部