you can do this in middleware
L5: How to validate date input before passing to rules method in a form request?
I have a form which includes a deadline and the user should pick a deadline which is a Persian date. In the form Request, I'm compiling four fields into a deadline. So my form Request is like this:
public function rules()
{
$this->prepInput();
return [
];
}
public function prepInput(){
$input=$this->all();
...
$input['deadline']=$this->prepDeadline($input['hour'], $input['month'], $input['day'], $input['year']);
...
$this->replace($input);
}
public function prepDeadline($hour,$month,$day, $year){
$time = jDateTime::mktime($hour, 0, 0, $month, $day, $year);
return $deadline = strftime("%Y-%m-%d %H:%M:%S", $time);
}
and I need to check if the user have selected a valid date or not (e.g. 1394/12/31 is not a valid date). The jDatetime package has a checkdate method which works exactly like php checkdate. Where and how can I validate the date in this formRequest and notify the user to select a valid date? In fact I need this validation to take place before the deadline is passed to prepInput().
Here is I think your final solution::
Run artisan commnad:
artisan make:middleware Deadline
your Deadline class,,
<?php
namespace App\Http\Middleware;
use Closure;
class Deadline
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$input = $request->all();
$input['deadline'] = $this->prepDeadline($input['hour'], $input['month'], $input['day'], $input['year']);
$request->replace($input);
return $next($request);
}
private function prepDeadline($hour,$month,$day, $year){
$time = jDateTime::mktime($hour, 0, 0, $month, $day, $year);
return $deadline = strftime("%Y-%m-%d %H:%M:%S", $time);
}
}
Register middle ware in Http/kernal.php
protected $routeMiddleware = [
'auth' => 'App\Http\Middleware\Authenticate',
'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth',
'Apiauth' => 'App\Http\Middleware\ApiAuth',
'deadline' => 'App\Http\Middleware\Deadline'
];
in controller add constructor
public function __construct()
{
$this->middleware('deadline', ['only' => ['fooAction', 'barAction']]); //put your method name in which you need this
}
Please or to participate in this conversation.