Rõ ràng từ tên của gói này, nó giúp xác thực địa chỉ email. Nó giúp chúng tôi đảm bảo địa chỉ email đã cung cấp có hợp lệ (theo một số tiêu chuẩn) hay không
Laravel có một công cụ Xác thực mạnh mẽ giúp bạn xác thực dữ liệu của mình theo các yêu cầu đến. Nó cũng cung cấp một số cách để thực hiện xác nhận
- Bằng cách gọi phương thức validate trên đối tượng Request bên trong phương thức điều khiển
- Bằng cách gọi phương thức $this->validate() bên trong phương thức điều khiển
- Bằng cách sử dụng một lớp class UsersController { public function store(UsersRequest $request) { User::create($request->validated()); } } 0 riêng biệt
- Phương pháp class UsersController { public function store(UsersRequest $request) { User::create($request->validated()); } } 1 được cung cấp bằng cách sử dụng đặc điểm ________0____2 trên bộ điều khiển
Chúng tôi sẽ tuân theo xác thực dựa trên class UsersController { public function store(UsersRequest $request) { User::create($request->validated()); } } 0 vì nó đang trở thành một tiêu chuẩn trong cộng đồng Laravel
Lặn mã
Giả sử chúng ta đang xác thực trường địa chỉ email như bên dưới bên trong một class UsersController
{
public function store(UsersRequest $request)
{
User::create($request->validated());
}
}
0
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class UsersRequest extends FormRequest { public function rules() { return [ 'email_address' => ['email'] ]; } }
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Và sau đó sử dụng class UsersController
{
public function store(UsersRequest $request)
{
User::create($request->validated());
}
}
5 bên trong bộ điều khiển như bên dưới
class UsersController { public function store(UsersRequest $request) { User::create($request->validated()); } }
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Điều gì xảy ra khi chúng tôi gửi yêu cầu?
Khi chúng tôi gửi yêu cầu đến phương thức điều khiển ở trên, nhà cung cấp dịch vụ có tên class UsersController { public function store(UsersRequest $request) { User::create($request->validated()); } } 6 được khởi động (cùng với các nhà cung cấp dịch vụ khác)
Chúng ta hãy xem phương pháp khởi động của nó
namespace Illuminate\Foundation\Providers; use Illuminate\Contracts\Validation\ValidatesWhenResolved; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Routing\Redirector; use Illuminate\Support\ServiceProvider; class FormRequestServiceProvider extends ServiceProvider { public function boot() { *$this->app->afterResolving(ValidatesWhenResolved::class, function ($resolved) { $resolved->validateResolved(); });* $this->app->resolving(FormRequest::class, function ($request, $app) { $request = FormRequest::createFrom($app['request'], $request); $request->setContainer($app) ->setRedirector($app->make(Redirector::class)); }); } }
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Nếu chúng tôi diễn giải khối mã được đánh dấu, nó sẽ cho biết
Sau khi giải quyết lớp thực hiện giao diện class UsersController { public function store(UsersRequest $request) { User::create($request->validated()); } } 7, hãy gọi phương thức class UsersController { public function store(UsersRequest $request) { User::create($request->validated()); } } 8 trên thể hiện của nó
Lớp class UsersController
{
public function store(UsersRequest $request)
{
User::create($request->validated());
}
}
5 của chúng tôi mở rộng lớp class UsersController
{
public function store(UsersRequest $request)
{
User::create($request->validated());
}
}
0 thực hiện giao diện class UsersController
{
public function store(UsersRequest $request)
{
User::create($request->validated());
}
}
7. Việc triển khai cho phương pháp class UsersController
{
public function store(UsersRequest $request)
{
User::create($request->validated());
}
}
8 đã được thêm vào một Đặc điểm có thể tìm thấy tại namespace Illuminate\Foundation\Providers;
use Illuminate\Contracts\Validation\ValidatesWhenResolved;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Routing\Redirector;
use Illuminate\Support\ServiceProvider;
class FormRequestServiceProvider extends ServiceProvider
{
public function boot()
{
*$this->app->afterResolving(ValidatesWhenResolved::class,
function ($resolved) {
$resolved->validateResolved();
});*
$this->app->resolving(FormRequest::class, function ($request, $app) {
$request = FormRequest::createFrom($app['request'], $request);
$request->setContainer($app)
->setRedirector($app->make(Redirector::class));
});
}
}
3 được đưa ra bên dưới
public function validateResolved() { $this->prepareForValidation(); if (!$this->passesAuthorization()) { $this->failedAuthorization(); } **$instance = $this->getValidatorInstance();** **if ($instance->fails()) { $this->failedValidation($instance); }** $this->passedValidation(); }
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Phương thức namespace Illuminate\Foundation\Providers;
use Illuminate\Contracts\Validation\ValidatesWhenResolved;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Routing\Redirector;
use Illuminate\Support\ServiceProvider;
class FormRequestServiceProvider extends ServiceProvider
{
public function boot()
{
*$this->app->afterResolving(ValidatesWhenResolved::class,
function ($resolved) {
$resolved->validateResolved();
});*
$this->app->resolving(FormRequest::class, function ($request, $app) {
$request = FormRequest::createFrom($app['request'], $request);
$request->setContainer($app)
->setRedirector($app->make(Redirector::class));
});
}
}
4 đã được ghi đè bên trong lớp class UsersController
{
public function store(UsersRequest $request)
{
User::create($request->validated());
}
}
0 như bên dưới
/** * Get the validator instance for the request. * * @return \Illuminate\Contracts\Validation\Validator */ protected function getValidatorInstance() { if ($this->validator) { return $this->validator; } $factory = $this->container->make(ValidationFactory::class); if (method_exists($this, 'validator')) { $validator = $this->container->call( [$this, 'validator'], compact('factory') ); } else { $validator = $this->createDefaultValidator($factory); } if (method_exists($this, 'withValidator')) { $this->withValidator($validator); } $this->setValidator($validator); return $this->validator; } /** * Create the default validator instance. * * @param \Illuminate\Contracts\Validation\Factory $factory * @return \Illuminate\Contracts\Validation\Validator */ protected function createDefaultValidator(ValidationFactory $factory) { return $factory->make( $this->validationData(), $this->container->call([$this, 'rules']), $this->messages(), $this->attributes() )->stopOnFirstFailure($this->stopOnFirstFailure); }
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Để dễ hiểu đoạn code trên có thể dịch sang
Nếu nhà phát triển đã cung cấp triển khai trình xác thực của riêng họ bằng cách sử dụng phương pháp namespace Illuminate\Foundation\Providers; use Illuminate\Contracts\Validation\ValidatesWhenResolved; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Routing\Redirector; use Illuminate\Support\ServiceProvider; class FormRequestServiceProvider extends ServiceProvider { public function boot() { *$this->app->afterResolving(ValidatesWhenResolved::class, function ($resolved) { $resolved->validateResolved(); });* $this->app->resolving(FormRequest::class, function ($request, $app) { $request = FormRequest::createFrom($app['request'], $request); $request->setContainer($app) ->setRedirector($app->make(Redirector::class)); }); } } 6 trên lớp class UsersController { public function store(UsersRequest $request) { User::create($request->validated()); } } 5, hãy sử dụng Trình xác thực đó. Mặt khác, namespace Illuminate\Foundation\Providers; use Illuminate\Contracts\Validation\ValidatesWhenResolved; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Routing\Redirector; use Illuminate\Support\ServiceProvider; class FormRequestServiceProvider extends ServiceProvider { public function boot() { *$this->app->afterResolving(ValidatesWhenResolved::class, function ($resolved) { $resolved->validateResolved(); });* $this->app->resolving(FormRequest::class, function ($request, $app) { $request = FormRequest::createFrom($app['request'], $request); $request->setContainer($app) ->setRedirector($app->make(Redirector::class)); }); } } 8 và cung cấp namespace Illuminate\Foundation\Providers; use Illuminate\Contracts\Validation\ValidatesWhenResolved; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Routing\Redirector; use Illuminate\Support\ServiceProvider; class FormRequestServiceProvider extends ServiceProvider { public function boot() { *$this->app->afterResolving(ValidatesWhenResolved::class, function ($resolved) { $resolved->validateResolved(); });* $this->app->resolving(FormRequest::class, function ($request, $app) { $request = FormRequest::createFrom($app['request'], $request); $request->setContainer($app) ->setRedirector($app->make(Redirector::class)); }); } } 9, public function validateResolved() { $this->prepareForValidation(); if (!$this->passesAuthorization()) { $this->failedAuthorization(); } **$instance = $this->getValidatorInstance();** **if ($instance->fails()) { $this->failedValidation($instance); }** $this->passedValidation(); } 0 và public function validateResolved() { $this->prepareForValidation(); if (!$this->passesAuthorization()) { $this->failedAuthorization(); } **$instance = $this->getValidatorInstance();** **if ($instance->fails()) { $this->failedValidation($instance); }** $this->passedValidation(); } 1, v.v. đến trường hợp public function validateResolved() { $this->prepareForValidation(); if (!$this->passesAuthorization()) { $this->failedAuthorization(); } **$instance = $this->getValidatorInstance();** **if ($instance->fails()) { $this->failedValidation($instance); }** $this->passedValidation(); } 2
Bây giờ, một phiên bản Trình xác thực đã được tạo, tiếp theo trong phương thức public function validateResolved()
{
$this->prepareForValidation();
if (!$this->passesAuthorization()) {
$this->failedAuthorization();
}
**$instance = $this->getValidatorInstance();**
**if ($instance->fails()) {
$this->failedValidation($instance);
}**
$this->passedValidation();
}
3 sẽ gọi phương thức public function validateResolved()
{
$this->prepareForValidation();
if (!$this->passesAuthorization()) {
$this->failedAuthorization();
}
**$instance = $this->getValidatorInstance();**
**if ($instance->fails()) {
$this->failedValidation($instance);
}**
$this->passedValidation();
}
4 của phiên bản đã cho
namespace Illuminate\Validation; class Validator implements ValidatorContract { public function fails() { return ! $this->passes(); } //ripped off implementation of passes() method public function passes() { foreach ($this->rules as $attribute => $rules) { **foreach ($rules as $rule) { $this->validateAttribute($attribute, $rule); }** } } //ripped off implementation of validateAttribute() method protected function validateAttribute($attribute, $rule) { $this->currentRule = $rule; [$rule, $parameters] = ValidationRuleParser::parse($rule); if ($rule == '') { return; } $value = $this->getValue($attribute); $validatable = $this->isValidatable($rule, $attribute, $value); **$method = "validate{$rule}";** if ($validatable &&! **$this->$method($attribute, $value, $parameters, $this)**) { $this->addFailure($attribute, $rule, $parameters); } } }
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Phương thức public function validateResolved() { $this->prepareForValidation(); if (!$this->passesAuthorization()) { $this->failedAuthorization(); } **$instance = $this->getValidatorInstance();** **if ($instance->fails()) { $this->failedValidation($instance); }** $this->passedValidation(); } 4 gọi phương thức public function validateResolved() { $this->prepareForValidation(); if (!$this->passesAuthorization()) { $this->failedAuthorization(); } **$instance = $this->getValidatorInstance();** **if ($instance->fails()) { $this->failedValidation($instance); }** $this->passedValidation(); } 6 lần lượt gọi phương thức public function validateResolved() { $this->prepareForValidation(); if (!$this->passesAuthorization()) { $this->failedAuthorization(); } **$instance = $this->getValidatorInstance();** **if ($instance->fails()) { $this->failedValidation($instance); }** $this->passedValidation(); } 7. Đây là nơi các thuộc tính dữ liệu của chúng tôi được kiểm tra theo các quy tắc xác thực mà chúng tôi đã cung cấp
Chuỗi public function validateResolved() { $this->prepareForValidation(); if (!$this->passesAuthorization()) { $this->failedAuthorization(); } **$instance = $this->getValidatorInstance();** **if ($instance->fails()) { $this->failedValidation($instance); }** $this->passedValidation(); } 8 đang tạo tên phương thức cho quy tắc đã cho. Vì chúng tôi đang khám phá quy tắc xác thực email, nó sẽ trở thành public function validateResolved() { $this->prepareForValidation(); if (!$this->passesAuthorization()) { $this->failedAuthorization(); } **$instance = $this->getValidatorInstance();** **if ($instance->fails()) { $this->failedValidation($instance); }** $this->passedValidation(); } 9. Tiếp theo, phương thức này đang được gọi như một phần của điều kiện /** * Get the validator instance for the request. * * @return \Illuminate\Contracts\Validation\Validator */ protected function getValidatorInstance() { if ($this->validator) { return $this->validator; } $factory = $this->container->make(ValidationFactory::class); if (method_exists($this, 'validator')) { $validator = $this->container->call( [$this, 'validator'], compact('factory') ); } else { $validator = $this->createDefaultValidator($factory); } if (method_exists($this, 'withValidator')) { $this->withValidator($validator); } $this->setValidator($validator); return $this->validator; } /** * Create the default validator instance. * * @param \Illuminate\Contracts\Validation\Factory $factory * @return \Illuminate\Contracts\Validation\Validator */ protected function createDefaultValidator(ValidationFactory $factory) { return $factory->make( $this->validationData(), $this->container->call([$this, 'rules']), $this->messages(), $this->attributes() )->stopOnFirstFailure($this->stopOnFirstFailure); } 0
Vì việc triển khai tất cả các phương pháp xác thực có sẵn có thể được tìm thấy trong đặc điểm /**
* Get the validator instance for the request.
*
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function getValidatorInstance()
{
if ($this->validator) {
return $this->validator;
}
$factory = $this->container->make(ValidationFactory::class);
if (method_exists($this, 'validator')) {
$validator = $this->container->call(
[$this, 'validator'], compact('factory')
);
} else {
$validator = $this->createDefaultValidator($factory);
}
if (method_exists($this, 'withValidator')) {
$this->withValidator($validator);
}
$this->setValidator($validator);
return $this->validator;
}
/**
* Create the default validator instance.
*
* @param \Illuminate\Contracts\Validation\Factory $factory
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function createDefaultValidator(ValidationFactory $factory)
{
return $factory->make(
$this->validationData(),
$this->container->call([$this, 'rules']),
$this->messages(),
$this->attributes()
)->stopOnFirstFailure($this->stopOnFirstFailure);
}
1. Do đó, phương pháp public function validateResolved()
{
$this->prepareForValidation();
if (!$this->passesAuthorization()) {
$this->failedAuthorization();
}
**$instance = $this->getValidatorInstance();**
**if ($instance->fails()) {
$this->failedValidation($instance);
}**
$this->passedValidation();
}
9 bên dưới
namespace Illuminate\Validation\Concerns; use Egulias\EmailValidator\EmailValidator; use Egulias\EmailValidator\Validation\DNSCheckValidation; use Egulias\EmailValidator\Validation\MultipleValidationWithAnd; use Egulias\EmailValidator\Validation\NoRFCWarningsValidation; use Egulias\EmailValidator\Validation\RFCValidation; use Egulias\EmailValidator\Validation\SpoofCheckValidation; trait ValidatesAttributes { /** * Validate that an attribute is a valid e-mail address. * * @param string $attribute * @param mixed $value * @param array $parameters * @return bool */ public function validateEmail($attribute, $value, $parameters) { $validations = collect($parameters) ->unique() ->map(function ($validation) { if ($validation === 'rfc') { return new RFCValidation(); } elseif ($validation === 'strict') { return new NoRFCWarningsValidation(); } elseif ($validation === 'dns') { return new DNSCheckValidation(); } elseif ($validation === 'spoof') { return new SpoofCheckValidation(); } elseif ($validation === 'filter') { return new FilterEmailValidation(); } elseif ($validation === 'filter_unicode') { return FilterEmailValidation::unicode(); } elseif (is_string($validation) && class_exists($validation)) { return $this->container->make($validation); } }) ->values() ->all() ?: [new RFCValidation()]; return (new EmailValidator)->isValid($value, new MultipleValidationWithAnd($validations)); }}
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Đây là cách Laravel xác thực địa chỉ email bằng cách tận dụng các lớp xác thực email khác nhau từ gói /** * Get the validator instance for the request. * * @return \Illuminate\Contracts\Validation\Validator */ protected function getValidatorInstance() { if ($this->validator) { return $this->validator; } $factory = $this->container->make(ValidationFactory::class); if (method_exists($this, 'validator')) { $validator = $this->container->call( [$this, 'validator'], compact('factory') ); } else { $validator = $this->createDefaultValidator($factory); } if (method_exists($this, 'withValidator')) { $this->withValidator($validator); } $this->setValidator($validator); return $this->validator; } /** * Create the default validator instance. * * @param \Illuminate\Contracts\Validation\Factory $factory * @return \Illuminate\Contracts\Validation\Validator */ protected function createDefaultValidator(ValidationFactory $factory) { return $factory->make( $this->validationData(), $this->container->call([$this, 'rules']), $this->messages(), $this->attributes() )->stopOnFirstFailure($this->stopOnFirstFailure); } 3
Sự thật thú vị về gói này trong bối cảnh Laravel
- Gói này lần đầu tiên được sử dụng bởi Laravel trong v5. 8
- Yêu cầu kéo để thêm chức năng này do Leo Sjöberg mở và được Taylor Otwell hợp nhất vào tháng 11 năm 2018
- PR có thể được tìm thấy ở đây
- Trước khi thêm gói này, Laravel đã sử dụng hàm filter_var của PHP để xác thực địa chỉ email
Tôi hy vọng bạn thích bài viết này. Tiếp theo, chúng ta sẽ xem cách Laravel sử dụng gói /** * Get the validator instance for the request. * * @return \Illuminate\Contracts\Validation\Validator */ protected function getValidatorInstance() { if ($this->validator) { return $this->validator; } $factory = $this->container->make(ValidationFactory::class); if (method_exists($this, 'validator')) { $validator = $this->container->call( [$this, 'validator'], compact('factory') ); } else { $validator = $this->createDefaultValidator($factory); } if (method_exists($this, 'withValidator')) { $this->withValidator($validator); } $this->setValidator($validator); return $this->validator; } /** * Create the default validator instance. * * @param \Illuminate\Contracts\Validation\Factory $factory * @return \Illuminate\Contracts\Validation\Validator */ protected function createDefaultValidator(ValidationFactory $factory) { return $factory->make( $this->validationData(), $this->container->call([$this, 'rules']), $this->messages(), $this->attributes() )->stopOnFirstFailure($this->stopOnFirstFailure); } 4. Bạn có thể theo dõi tôi trên Twitter hoặc tham gia bản tin của tôi để cập nhật cho mình