系统服务

来自tomtalk
Tom讨论 | 贡献2016年9月18日 (日) 09:42的版本 表单请求验证

跳转至: 导航搜索

事件

Laravel事件提供了简单的侦听器实现,允许你订阅和监听事件,事件类通常被保存在app/Events目录下,而它们的侦听器被保存在app/Listeners目录下。

错误与日志

//.env
APP_DEBUG=true
 
// bootstrap/app.php
$app->withFacades();
 
//引用Log
use Log;
 
// 8个日志级别
Log::emergency($error);
Log::alert($error);
Log::critical($error);
Log::error($error);
Log::warning($error);
Log::notice($error);
Log::info($error);
Log::debug($error);

测试

public function testTom()
{
    $response = $this->call('get', '/userInfo');
    $result = json_decode($response->original);
 
    $this->assertEquals(
        'Tom', $result->name
    );
}

缓存

use Cache;
 
if (Cache::has('key')) {
    $coupon_total = Cache::get('key');
} else {
    $rs = Coupon_api::instance()->total();
 
    if ($rs['status']) {
        $coupon_total = $rs['data']['total_amount'];
    }
 
    Cache::put('key', $coupon_total, 5); //5 minutes
}

session

session使用
use Illuminate\Http\Request;
 
function blade(Request $request)
{
    //赋值
    session(['name'=> 'Tom']);
    $request->session()->put('name', 'Tom');
    $request->session()->push('students', 'Tom');
 
    //取值
    $name = session('name');
    $request->session()->get('students');
}


Session store not set on request.
// Kernel.php添加中间件
protected $middleware = [
    //...
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
];

表单验证

一个简单的例子

开始照着手册上的例子作练习,发现页面显示不了,猜想是不是代码没写全,补充了其它代码,也不行,后来发现页面不显示,浏览器报两种错误:

  • 500:我糊乱把ajax验证的代码抄过来用,代码执行错误。
  • too many redirects:validate验证不过,会直接返回一个reponse,表单和后台用一个控制器,就反复不断循环跳转到自己。

花了很久时间才终于弄明白,原来是我验证流程没弄明白,正确的代码也执行不了。

function input()
{
    return view('input');
}
 
function store(Request $request)
{
    $request->flash();
 
    $this->validate($request, [
        'name' => 'required|max:5',
        'old' => 'required',
    ], [
        'name.required' => '请填写姓名',
        'name.max' => '姓名不能超过:max个字符',
        'old.required' => '我们需要知道你的年龄',
    ]);
 
    return 'validation is OK!';
}

注意事项

  1. 默认情况下,Laravel的基底控制器类使用了ValidatesRequests trait,其提供了一种便利的方法来使用各种强大的验证规则验证传入的HTTP请求。在控制器中,用$this->validate()来使用验证功能。
  2. $this->validate()如果验证失败,则会抛出异常错误消息并自动生成一个对应的响应。
  3. 所有的验证错误会被自动闪存至session。
  4. $errors变量在每次请求的所有视图中都可以被使用。

AJAX验证

use Validator;
 
function store(Request $request)
{
    $validator = Validator::make($request->all(), [
        'name' => 'required|max:5',
        'old' => 'required',
    ]);
 
    return $validator->errors();
}

手动创建验证程序

如果你不想要使用ValidatesRequests trait的validate方法,你可以手动创建一个validator实例并通过Validator::make方法在facade生成一个新的validator实例。

function store(Request $request)
{
    $validator = Validator::make($request->all(), [
        'name' => 'required|max:5',
        'old' => 'required',
    ]);
 
    if ($validator->fails()) {
        return redirect('/input')
            ->withErrors($validator)
            ->withInput();
    }
 
    return 'validation is OK!';
}

表单请求类

怎样才能较好的运行验证规则呢?

为了不使验证逻辑而把控制器弄得一团糟,也为了能应付更复杂的验证情境,你可能会想要创建一个form request,然后在在控制器方法中利用类型提示传入请求,这样传入的请求会在控制器方法被调用前进行验证。


1、生成表单请求类
php artisan make:request StoreBlogPostRequest


2、使用表单请求类
public function store(StoreBlogPostRequest $request){
    // 传入的请求是有效的...
}


3、表单请求类
//如果你打算在应用程序的其它部分处理授权逻辑,只需从authorize方法返回true。
public function authorize(){
    $commentId = $this->route('comment');
 
    return Comment::where('id', $commentId)
                  ->where('user_id', Auth::id())->exists();
}
 
//验证规则
public function rules(){
    return [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ];
}
 
//错误消息
public function messages(){
    return [
        'title.required' => '标题是必填的',
        'body.required'  => '消息是必填的',
    ];
}

复杂的条件验证

如果年纪大于100岁,一定要写长寿原因。这种验证条件,只能在控制器中验证,不能在表单请求类中写rules来实现。

function store(Request $request)
{
    $validator = Validator::make($request->all(), [
        'name' => 'required|max:5',
        'old' => 'required',
    ], [
        'name.required' => '请填写姓名',
        'name.max' => '姓名不能超过:max个字符',
        'old.required' => '我们需要知道你的年龄',
        'reason.required' => '你为何如此长寿?'
    ]);
 
    $validator->sometimes(['reason'], 'required', function ($input) {
        return $input->old >= 100;
    });
 
    if ($validator->fails()) {
        return redirect('/input')
            ->withErrors($validator)
            ->withInput();
    }
 
    return 'validation is OK!';
}