Laravel技巧库

表单验证

此课程是收费课程,请先购买或加入会员后再访问。

这里的用户发布信息还没有做数据验证。

开发界中有一句话说的很好,永远不要相信用户的输入。因为用户可能会输入各种非法的数据。所以这里的数据验证就变得格外重要了。

新增部分

controller

public function store(Request $request)
{
    $request->validate([
        'title' => 'required|unique:issues|max:255',
        'content' => 'required',
    ]);

    Issue::create($request->all());
    return redirect('/')->with('notice', 'Issue 新增成功~');
}
规则 意义
required 必须填写
unique:issues 查询issues表,不能有重复的数据
max:255 最大长度 255

更多验证规则 https://laravel.com/docs/5.5/validation#available-validation-rules

_flash.blade.php

@if (count($errors) > 0)
    <div class="am-alert am-alert-danger">
        <div class="am-container">
            <h2>Oops~ There's something wrong!</h2>
            <ul>
                @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
                @endforeach
            </ul>
        </div>
    </div>
@endif

form

表单部分修改下,这样如果提价后,填写的信息全部都不见了。这里加上old就可以了,他会显示出上一次提交的数据。

<input type="text" placeholder="输入活动标题" name="title" value="{{old('title')}}">

<!-- ... -->

<textarea rows="5" name="content">{{old('content')}}</textarea>

编辑部分

controller

public function update(Request $request, Issue $issue)
{
    $request->validate([
        'title' => 'required|unique:issues,title,' . $issue->id . '|max:255',
        'content' => 'required',
    ]);
    $issue->update($request->all());
    return redirect(route('issues.show', $issue->id))->with('notice', 'Issue 修改成功~');
}

编辑部分,稍微有一点点不一样,如果用户不想修改标题。直接提交后,会提示标题已经存在了。
那这里就应该要排除掉当前的正在编辑的issue

form

表单部分一样要加上old,与新增不同的是,如果没有提交之前,需要显示数据库查询到的文章信息。那这里应该这么写。

<input type="text" placeholder="输入活动标题" name="title" value="{{old('title', $issue->title)}}">

<!-- ... -->

<textarea rows="5" name="content">{{old('content', $issue->content)}}</textarea>

Form Requests

这些写看着还不错,功能已经实现了,但却会造成控制器中的代码变得臃肿。
那能不能把验证部分的代码分离出去呢?这也是可以的。方法是要自己新建一个request

新增部分

php artisan make:request StoreIssue 
class StoreIssue extends FormRequest
{
    //开启验证
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'title' => 'required|unique:issues|max:255',
            'content' => 'required',
        ];
    }
}

编辑部分

php artisan make:request UpdateIssue
class UpdateIssue extends FormRequest
{

    //自定义错误信息
    public function messages()
    {
        return [
            'title.required' => '你的标题被狗吃了。',
        ];
    }

    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        $issue = $this->route('issue');
        return [
            'title' => 'required|unique:issues,title,' . $issue->id . '|max:255',
            'content' => 'required',
        ];
    }
}

Tips:
这里先要去通过$this->route,去路由中把当前的issue找到,然后再排除掉当前的id
如果你对提示信息不满意,可以在messages方法中自定义错误提示信息。

controller

//...

use App\Http\Requests\StoreIssue, App\Http\Requests\UpdateIssue;

class IssuesController extends Controller
{
    public function store(StoreIssue $request)
    {
        //...
    }

    public function update(UpdateIssue $request, Issue $issue)
    {
        //...
    }
}

还要先use一下他们,然后这里用依赖注入的写法,改成对应的request