diff --git a/blog/laravel/index.md b/blog/laravel/index.md index 860bd3e1f191636e851b0c6a04a1aaf4b6920ede..53e0afbe00ef7eb0edddeb9d570dcb4fba02cc94 100644 --- a/blog/laravel/index.md +++ b/blog/laravel/index.md @@ -62,5 +62,10 @@ dev: [中间件 Middleware](/blog/laravel/middleware.md) +Blade模板(略) -https://www.bilibili.com/video/BV1gE411j78F?p=38&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da \ No newline at end of file +[表单验证validate](/blog/laravel/validate.md) + +[数据分页 paginate](/blog/laravel/paginate.md) + +https://www.bilibili.com/video/BV1gE411j78F?p=43&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da \ No newline at end of file diff --git a/blog/laravel/paginate.md b/blog/laravel/paginate.md new file mode 100644 index 0000000000000000000000000000000000000000..004d28389c5fb34bf2374f6451f860dbb32823bc --- /dev/null +++ b/blog/laravel/paginate.md @@ -0,0 +1,70 @@ +# 数据分页 paginate + +创建分页 + +数据库DB方式的分页 +```php +// 每页显示 5 条 +$users = DB::table('users')->paginate(5); +``` + +模型创建分页 +```php +$users = User::paginate(5); +``` + +分页按钮直接使用links()方法即可,它继承了Bootstrap样式 + +```php +{{$list->links()}} +``` + +使用withPath()方法,更改路由地址 + +```php +$users->withPath('/users/list'); +``` +指定参数,可以使用appends()方法 +```php +{{$list->appends(['sort'=>'id'])->links()}} +``` + +保存所有查询参数,可以使用withQueryString()方法; +```php +{{$list->withQueryString()->links()}} +``` + +使用fragment()方法给URL地址#符号 + +```php +{{$list->fragment('element')->links()}} +``` + +大量分页中...省略分页数量,使用onEachSize()方法可设置外侧数量,默认3 +```php + {{$list->onEachSide(1)->links()}} +``` + +更多方法 +| 方法 | 描述 +| - | - +| $results->count() | 获取当前页数据的数量 +| $results->currentPage() | 获取当前页页码 +| $results->hasPages() | 是否有多页 +| $results->hasMorePages() | 是否有更多页 +| $results->firstItem() | 获取结果集中第一条数据的结果编号 +| $results->getOptions() | 获取分页器选项 +| $results->items() | 获取当前页的所有项 +| $results->lastItem() | 获取结果集中最后一条数据的结果编号 +| $results->lastPage() | 获取最后一页的页码。 (在 simplePaginate 无效) +| $results->nextPageUrl() | 获取下一页的 URL +| $results->onFirstPage() | 当前页是否为第一页 +| $results->perPage() | 每页的数据条数 +| $results->getUrlRange($start, | 创建分页 URL 的范围 +| $end) | +| $results->previousPageUrl() | 获取前一页的 URL +| $results->total() | 数据总数(在 simplePaginate 无效) +| $results->url($page) | 获取指定页的 URL +| $results->getPageName() | 获取分页的查询字符串变量 +| $results->setPageName($name) | 设置分页的查询字符串变量 +``` \ No newline at end of file diff --git a/blog/laravel/validate.md b/blog/laravel/validate.md new file mode 100644 index 0000000000000000000000000000000000000000..e37ee0e5f116b6189888283c876372dab43034e2 --- /dev/null +++ b/blog/laravel/validate.md @@ -0,0 +1,383 @@ +# 表单验证validate + +## 表单快速验证 + +两个路由:一个表单,一个处理表单 + +```php +//表单页 +Route::get('/task/form','TaskController@form'); +//接收页 +Route::post('/task/receive','TaskController@receive'); +``` + +表单 + +```html +
+ @csrf +用户名: +密码: + +
+``` + +表单处理页 +```php +public function receive(Request $request) +{ + // 验证请求方式 + // 左边为验证字段,右边为验证规则,每个规则竖线隔开 + // 比如 required 不得为空,min 不等小于,max 不得大于 + $request->validate([ + 'username' => 'required|min:2|max:10', + 'password' => 'required|min:6', + ]); + // 只有通过才能执行下面的语句,否则返回表单页 + return '恭喜验证通过!'; +} +``` + +如果验证没有被通过,会自动重定向到提交页,并将错误信息存储到session中 +```php +// 内部操作是通过中间件:Illuminate\View\Middleware\ShareErrorsFromSession +@if($errors->any()) +
+ +
+@endif +``` + +也可以单独设置错误信息,使用@error指令 + +```php +@error('username') +
{{ $message }} : 用户名非法!
+@enderror + +@error('password') +
{{ $message }} : 密码非法!
+@enderror +``` + +规则写法 + +```php +//数组方式验证 +$request->validate([ + 'username' => ['required', 'min:2', 'max:10'], + 'password' => ['required', 'min:6'] +]); +``` + +## 验证类的使用 + +创建一个验证类 + +```bash +php artisan make:request Form +``` + +```php +// Http\Request\Form.php +public function authorize() +{ + // 默认 false,为关闭授权,关闭状态会 403 + // 比如判断这个用户是否有操作权限 + return true; +} + +public function rules() +{ + return [ + //规则 + 'username' => 'required|min:2|max:10', + 'password' => 'required|min:6', + ]; +} +``` +使用验证类 + +```php +// 通过验证类验证 +$request->validated(); +``` + +设置成中文提示 +```php +//验证器类方法 +public function messages() +{ + return [ + 'username.required' => '用户名不得为空~', + 'username.min' => '用户名不得小于2位~', + 'username.max' => '用户名不得大于10位~', + 'password.required' => '密码不得为空', + 'password.min' => '密码不得小于6位~', + ] +} +``` +自定义属性名,而其它采用默认提示 +```php +// 提示语言包在:resources\lang\en\validation.php +public function attributes() +{ + return [ + 'username' => '用户名', + ]; +} +``` + +请求验证之前,修改提交的请求数据 + +```php +protected function prepareForValidation() +{ + $this->merge([ + 'username' => 'Mr.Lee' + ]); +} +``` + +## 创建手动验证 + +快速验证方式 + +```php +$validateData = $request->validate([ + 'username' => 'required|min:2|max:10', + 'password' => 'required|min:6', +]); + +//验证通过后得到提交的值 +dd($validateData); +``` + +创建手动验证 + +```php +//手动创建验证器 +$validator = Validator::make($request->post(), [ + 'username' => 'required|min:2|max:10', + 'password' => 'required|min:6', +]); + +//如果没有通过的话 +if ($validator->fails()) { + //跳转后,并将错误保存,还可以返回上一次填的信息 + return redirect('/task/form') + ->withErrors($validator) + ->withInput(); +} +``` + +```php +// 快速验证,也支持 old 记忆上一次表单数据的功能 +用户名: +``` + +设置$errors的多个错误包 + +```php +$validator = Validator::make($request->post(), [ + 'username' => 'required|min:2|max:10', + 'password' => 'required|min:6', +])->validateWithBag('post'); +// 设置快速验证和手动验证 + +if ($validator->fails()) { + //适合手动验证 + return redirect('/task/form') + ->withErrors($validator, 'post') + ->withInput(); +} + +{{--多个错误包调用--}} +{{$errors->post}} +``` + +在验证完毕之前,通过附加回调添加更多的自定义错误信息 + +```php +//验证钩子 +$validator->after(function ($validator) { + $validator + ->errors() + ->add('info', '隐藏字段info的值不存在'); +}); +``` + +$errors对象方法 + +```php +any()判断 +all()获取全部 + +{{--获取指定字段第一条信息--}} +{{$errors->first('username')}} + +{{--判断指定字段是否有错误信息--}} +{{$errors->has('username')}} +``` + +## 验证规则大全 + +文档:https://learnku.com/docs/laravel/9.x/validation/12219#available-validation-rules + +```php +Accepted +Accepted If +Active URL +After (Date) +After Or Equal (Date) +Alpha +Alpha Dash +Alpha Numeric +Array +Bail +Before (Date) +Before Or Equal (Date) +Between +Boolean +Confirmed +Current Password +Date +Date Equals +Date Format +Declined +Declined If +Different +Digits +Digits Between +Dimensions (Image Files) +Distinct +Email +Ends With +Enum +Exclude +Exclude If +Exclude Unless +Exclude Without +Exists (Database) +File +Filled +Greater Than +Greater Than Or Equal +Image (File) +In +In Array +Integer +IP Address +MAC Address +JSON +Less Than +Less Than Or Equal +Max +MIME Types +MIME Type By File Extension +Min +Multiple Of +Not In +Not Regex +Nullable +Numeric +Password +Present +Prohibited +Prohibited If +Prohibited Unless +Prohibits +Regular Expression +Required +Required If +Required Unless +Required With +Required With All +Required Without +Required Without All +Required Array Keys +Same +Size +Sometimes +Starts With +String +Timezone +Unique (Database) +URL +UUID +``` + +(1) alpha_dash:字段必须由字母、数字破折号(-)和下划线(_)构成; + +```php +'username' => 'required|alpha_dash', +``` + + +(2) between:字段长度必须在指定的区间之间; +```php +'username' => 'required|between:2,6', +``` + +(3) .size:6:字段长度固定在某个值; +```php +'username' => 'required|size:6', +``` + +(4) .email:字段必须符合 email 格式; +```php +'username' => 'required|email', +``` + +(5) .unique:users:字段值是唯一的,通过指定数据表字段检查; +```php +'username' => 'required|unique:users', +``` + +(6) .confiremed:这个基本用于密码和密码确认,固定了字段名称; +```php +'password' => 'required|min:6|confirmed', + + +``` + +(7) different:password:字段和另一个字段不可以相同的验证; + +```php +'username' => 'required|different:password', +``` + + +(8) .ip/json:字段是否是 ip 地址/字段是否是 json 数据; +```php +'username' => 'required|ip', 'username' => 'required|json', +``` + +其它用法 + +Rule类 + +```php +'username' => 'required|in:tom,jack,lusy', + +'username' => [ + 'required', + Rule::in(['tom', 'jack', 'lusy']) +], +``` + +可以结合where来限制验证范围等操作 + +```php +//验证是否重复 +'username' => Rule::unique('users'), + +'username' => Rule::unique('users') + ->where(function ($query) { + $query->where('id', 20); + }), +``` diff --git a/doc/css.md b/doc/css.md index 3213028e948a1310c9448f7b3eadc411f2d1bdbc..7139c4dc3c9163751352cf5a5ffe2683daf5ab61 100644 --- a/doc/css.md +++ b/doc/css.md @@ -146,3 +146,4 @@ cssgr.id [https://cssgr.id/](https://cssgr.id/) CSS Diner: [https://flukeout.github.io/](https://flukeout.github.io/) +[Flex Cheatsheet](https://yoksel.github.io/flex-cheatsheet/): Demos for W3C CSS Flexbox Specification http://www.w3.org/TR/css-flexbox-1/ \ No newline at end of file