一.Laravel表單驗(yàn)證
創(chuàng)建控制器并在添加方法shore()中編寫驗(yàn)證
public function store(Request $request)
{
// 驗(yàn)證以及保存提交的數(shù)據(jù)...
}
編寫驗(yàn)證邏輯
validate 方法會(huì)接收 HTTP 傳入的請(qǐng)求以及驗(yàn)證的規(guī)則庐椒。如果驗(yàn)證通過(guò)瓣颅,你的代碼就可以正常的運(yùn)行。若驗(yàn)證失敗,則會(huì)拋出異常錯(cuò)誤消息并自動(dòng)將其返回給用戶。在一般的 HTTP 請(qǐng)求下劲绪,都會(huì)生成一個(gè)重定向響應(yīng),對(duì)于 AJAX 請(qǐng)求則會(huì)發(fā)送 JSON 響應(yīng)
public function store(Request $request)
{
$this->validate($request, [
'title' => 'required|unique:posts|max:255',//標(biāo)題不為空,post提交,最長(zhǎng)255
'body' => 'required',//主要內(nèi)容不為空
]);
//成功上傳新數(shù)據(jù)贾富,將其保存到數(shù)據(jù)庫(kù)...
}
嵌套屬性
$this->validate($request, [
'title' => 'required|unique:posts|max:255',
'author.name' => 'required',//在驗(yàn)證規(guī)則中使用「點(diǎn)」語(yǔ)法來(lái)指定他們
'author.description' => 'required',
]);
顯示驗(yàn)證錯(cuò)誤
Laravel 會(huì)自動(dòng)把用戶重定向到先前的位置歉眷。另外,所有的驗(yàn)證錯(cuò)誤會(huì)被自動(dòng) 閃存至 session
$errors 變量在每次請(qǐng)求的所有視圖中都可以被使用颤枪,你可以很方便的假設(shè) $errors 變量已被定義且進(jìn)行安全地使用
if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>//在視圖中顯示錯(cuò)誤的消息
@endforeach
</ul>
</div>
@endif
自定義閃存的錯(cuò)誤消息格式
在控制器中重寫 formatValidationErrors汗捡。別忘了將 Illuminate\Contracts\Validation\Validator 類引入到文件上方
<?php
namespace App\Http\Controllers;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
abstract class Controller extends BaseController
{
use DispatchesJobs, ValidatesRequests;
/**
* {@inheritdoc}
*/
protected function formatValidationErrors(Validator $validator)
{
return $validator->errors()->all();
}
}
表單請(qǐng)求驗(yàn)證
表單請(qǐng)求是一個(gè)自定義的請(qǐng)求類,里面包含著驗(yàn)證邏輯畏纲。要?jiǎng)?chuàng)建一個(gè)表單請(qǐng)求類扇住,可使用 Artisan 命令行命令 make:request
php artisan make:request StoreBlogPostRequest
新生成的類文件會(huì)被放在 app/Http/Requests 目錄下
public function rules() { return [ 'title' => 'required|unique:posts|max:255', 'body' => 'required', ]; }
在控制器方法中利用類型提示傳入請(qǐng)求。傳入的請(qǐng)求會(huì)在控制器方法被調(diào)用前進(jìn)行驗(yàn)證盗胀,意思就是說(shuō)你不會(huì)因?yàn)轵?yàn)證邏輯而把控制器弄得一團(tuán)糟
/**
* 保存?zhèn)魅氲牟┛臀恼隆? *
* @param StoreBlogPostRequest $request
* @return Response
*/
public function store(StoreBlogPostRequest $request)
{
// 傳入的請(qǐng)求是有效的...
}
如果驗(yàn)證失敗艘蹋,就會(huì)生成一個(gè)重定向響應(yīng)把用戶返回到先前的位置。這些錯(cuò)誤會(huì)被閃存到 session票灰,所以這些錯(cuò)誤都可以被顯示
授權(quán)表單請(qǐng)求
表單的請(qǐng)求類內(nèi)包含了 authorize 方法女阀。在這個(gè)方法中,你可以確認(rèn)用戶是否真的通過(guò)了授權(quán)屑迂,以便更新指定數(shù)據(jù)
/**
* 判斷用戶是否有權(quán)限做出此請(qǐng)求浸策。
*
* @return bool
*/
public function authorize()
{
$commentId = $this->route('comment');
return Comment::where('id', $commentId)
->where('user_id', Auth::id())->exists();
}
自定義閃存的錯(cuò)誤消息格式
自定義驗(yàn)證失敗時(shí)閃存到 session 的驗(yàn)證錯(cuò)誤格式,可在你的基底請(qǐng)求 (App\Http\Requests\Request) 中重寫 formatErrors,文件上方引入 Illuminate\Contracts\Validation\Validator 類
/**
* {@inheritdoc}
*/
protected function formatErrors(Validator $validator)
{
return $validator->errors()->all();
}
自定義錯(cuò)誤消息
(你可以通過(guò)重寫表單請(qǐng)求的 messages 方法來(lái)自定義錯(cuò)誤消息惹盼。此方法必須返回一個(gè)數(shù)組的榛,其中含有成對(duì)的屬性或規(guī)則以及對(duì)應(yīng)的錯(cuò)誤消息)
/**
* 獲取已定義驗(yàn)證規(guī)則的錯(cuò)誤消息。
*
* @return array
*/
public function messages()
{
return [
'title.required' => '標(biāo)題是必填的',
'body.required' => '消息是必填的',
];
}
處理錯(cuò)誤消息
調(diào)用一個(gè) Validator 實(shí)例的 errors 方法逻锐,會(huì)得到一個(gè) Illuminate\Support\MessageBag 的實(shí)例,里面有許多可讓你操作錯(cuò)誤消息的便利方法
$messages = $validator->errors(); echo $messages->first('email')//查看特定字段的第一個(gè)錯(cuò)誤消息
foreach ($messages->get('email') as $message) { //查看特定字段的所有錯(cuò)誤消息雕薪,取所有消息中的一個(gè)數(shù)組,可以使用 get 方法 }
foreach ($messages->all() as $message) { //查看所有字段的所有錯(cuò)誤消息 }
if ($messages->has('email')) { //判斷特定字段是否含有錯(cuò)誤消息 }
echo $messages->first('email', '<p>:message</p>');//獲取格式化后的錯(cuò)誤消息
foreach ($messages->all('<li>:message</li>') as $message) { //獲取所有格式化后的錯(cuò)誤消息 }
自定義錯(cuò)誤消息
通過(guò)傳遞三個(gè)參數(shù)到 Validator::make 方法來(lái)自定義驗(yàn)證消息
$messages = [
'required' => ':attribute 的字段是必要的。',//:attribute 占位符會(huì)被通過(guò)驗(yàn)證的字段實(shí)際名稱所取代
];
$validator = Validator::make($input, $rules, $messages);
指定自定義消息到特定的屬性
$messages = [ 'email.required' => '我們需要知道你的 e-mail 地址线罕!',//屬性名稱后加上「.」符號(hào)和指定驗(yàn)證的規(guī)則 ];
可用的驗(yàn)證規(guī)則<----#---->點(diǎn)我
二.重要知識(shí)點(diǎn)
1.隨機(jī)數(shù)(PHP7)
random_bytes 函數(shù)返回 string 類型澈吨,并接受一個(gè) int 類型為參數(shù),該參數(shù)規(guī)定了所返回字符串的字節(jié)長(zhǎng)度
$bytes = random_bytes('10'); var_dump(bin2hex($bytes));//bin2hex() 函數(shù)把 ASCII 字符的字符串轉(zhuǎn)換為十六進(jìn)制值燥爷。字符串可通過(guò)使用 pack() 函數(shù)再轉(zhuǎn)換回去 //possible ouput: string(20) "7dfab0af960d359388e6"
random_int 函數(shù)返回給定范圍內(nèi)的整型數(shù)
var_dump(random_int(1, 100)); //possible output: 27
2.毫秒級(jí)時(shí)間戳
<?php
function getMillisecond() {
list($t1, $t2) = explode(' ', microtime());//microtime() 函數(shù)返回當(dāng)前 Unix 時(shí)間戳的微秒數(shù),explode() 函數(shù)把字符串打散為數(shù)組,list() 函數(shù)用于在一次操作中給一組變量賦值
return (float)sprintf('%.0f',(floatval($t1)+floatval($t2))*1000);//sprintf() 函數(shù)把格式化的字符串寫入變量中,floatval ()獲取變量的浮點(diǎn)值,(float)獲取變量的浮點(diǎn)值
}
echo getMillisecond();
3.UUID(唯一識(shí)別碼)
http://www.reibang.com/p/792c2bbe107e
4.動(dòng)態(tài)獲取文件后綴
$ext = $file->getClientOriginalExtension();
5.文件類型表單驗(yàn)證
self::validate($request, [
'img' => 'required|mimes:jpeg,bmp,png,gif,jpg',
'photoName' => 'required|string|min:6|max:10'
]);
6.更換中文錯(cuò)誤提示信息
復(fù)制resources/lang/en/validation.php
文件到自己新建的zh-cn
目錄
然后替換其中的內(nèi)容https://laravel-china.org/articles/5840/validation-validation-in-laravel-returns-chinese-prompt
'attributes' => [
'name' => '名字',
'age' => '年齡',
'img' => '圖片',
'photoName' => '圖片名稱',
'user_name' => '姓名',
'pwd' => '密碼',
'sex' => '性別',//添加自定義字段
],
7.Laravel時(shí)間區(qū)修改
在config/app.php修改該字段
'timezone' => 'PRC',//把原來(lái)的TRC改為PRC
8.自定義配置使用
在config下新建一個(gè)存放配置的PHP文件
<?php
return [
'upload_dir' => public_path() . '/uploads',//上傳圖片的路徑
];
在頁(yè)面中調(diào)用:
config('sys.upload_dir')