Laravel Timestamp Validator

image

Laravel 5.1, Laravel 5.2, Lara… Код прогресує, оптимізується і розвивається. У новій (5.2) версії з'явився валідатор масивів, наприклад, але що робити, якщо необхідно провалидировать входить timestamp? Правильно, писати милицю.

Жив і живе один проект на Laravel 5.1. Точніше, живе його API сторона. Є необхідність «ганяти» туди-сюди різні дати. Але як їх ганяти, якщо існують часові пояси? Прийнято рішення встановити сервер UTC+0 і спілкуватися за допомогою timestamp, який на фронтенде легко перетворюється в потрібний час. Окей, питань з цього не виникло. Крім одного — як валідувати вхідні дані? Створимо власний валідатор.

Повний код валідатора в самому кінці статті.

Поїхали!

У папці app/Extensions/Validators створюємо файл і називаємо TimestampValidator.php.

namespace Lame\Extensions\Validators;

use Illuminate\Validation\Validator;

class TimestampValidator extends Validator{
}

Нам необхідно приймати, щоб входить дата підходила під «до» і «після».

Розглянемо перший приклад. У нас є дата народження користувача. Користувач повинен бути старше 10 років, тобто народжений до 2016 року. Відповідно, нам необхідно приймати дату, яка буде до 2016 року. Правила валідації вказуємо:

/** Беремо поточну дату, віднімаємо 10 років, додаємо один день і отримуємо timestamp від необхідної дати */
$date = Carbon::now()->subYears(10)->addDay(1)->timestamp;

/** Вказуємо, що входить дата у форматі timestamp повинна бути до потрібної дати в timestamp */
$rules = [
"bDay" => "numeric|before_timestamp:".$date,
];

З'явилося правило «before_timestamp». Повертаємося в наш валідатор і створюємо метод, який буде здійснювати необхідну перевірку. Назва методу повинно мати таку структуру: «validate<правило в camelCase форматі>». $value серед вхідних параметрів — значення, яке надійшло з поза. $parameters — масив параметрів, які вказали в правилах (before_timestamp:".$date).

public function validateBeforeTimestamp($attribute, $value, $parameters)
{
$value = (int)$value;

if ((int)$parameters[0] <= 0) {
throw new \Exception("Timestamp parameter in the beforeTimestamp validator not valid!");
}

if ($value != "" && $value >= $parameters[0]) {
return false;
}

return true;
}

Другий приклад. Нам необхідно створити завдання з дедлайном. Мінімальний дедлайн — 4 години. Створюємо правила:

$date = Carbon::now()->addHours(4)->timestamp;
$rules = [
"deadline" => "required|numeric|after_timestamp:".$date
];

З'явилося нове правило — «after_timestamp». Опрацюємо його в нашому валидаторе:

public function validateAfterTimestamp($attribute, $value, $parameters)
{
$value = (int)$value;

if ((int)$parameters[0] <= 0) {
throw new \Exception("Timestamp parameter in the beforeTimestamp validator not valid!");
}

if ($value != "" && $value <= $parameters[0]) {
return false;
}

return true;
}

Щоб підключити наш валідатор, я створив свій ServiceProvider в папці app/Providers — CustomValidateServiceProvider.php.

<?php
namespace Lame\Providers;

use Illuminate\Support\ServiceProvider;
use Lame\Extensions\Validators\TimestampValidator;
use Validator;

class CustomValidateServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Validator::resolver(function ($translator, $data, $rules, $messages) {
return new TimestampValidator($translator, $data, $rules, $messages);
});
}

/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}


На цьому, в принципі все. Повідомлення про помилки зазначаються у файлі validation.php.

"custom" => [
"deadline" => [
"after_timestamp" => "Deadline should be minimum 4 hours"
],

"bDay" => [
"before_timestamp" => "Age should be minimum 10 years",
"numeric" => "Birthday date should be in timestamp"
]
]

Повний код класу
<?php
namespace Lame\Extensions\Validators;

use Illuminate\Validation\Validator;

class TimestampValidator extends Validator
{
#region timestamp valitators - after_timestamp:{timestamp} | before_timestamp:{timestamp}
/**
* @param $attribute
* @param $value
* @param $parameters = ["date" => "Date before which should be input timestamp"]
* @return bool
* @throws \Exception
*/
public function validateBeforeTimestamp($attribute, $value, $parameters)
{
$value = (int)$value;

if ((int)$parameters[0] <= 0) {
throw new \Exception("Timestamp parameter in the beforeTimestamp validator not valid!");
}

if ($value != "" && $value >= $parameters[0]) {
return false;
}

return true;
}

/**
* @param $attribute
* @param $value
* @param $parameters = ["date" => "Date before which should be input timestamp"]
* @return bool
* @throws \Exception
*/
public function validateAfterTimestamp($attribute, $value, $parameters)
{
$value = (int)$value;

if ((int)$parameters[0] <= 0) {
throw new \Exception("Timestamp parameter in the beforeTimestamp validator not valid!");
}

if ($value != "" && $value <= $parameters[0]) {
return false;
}

return true;
}
#endregion
}


За допомогою date, after, before timestamp не перевіриш. Чи можна перевірити? Якщо можна, буду радий в коментарях, повідомленнях прочитати існуючі варіанти.

Джерело: Хабрахабр
  • avatar
  • 0

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.