Estoy procesando un formulario con entrada de fecha múltiple que no está en A.D. Para fines de validación, estoy usando Solicitud de formulario.
Antes de la validación y la inserción en mi base de datos, la entrada de fecha debe convertirse a A.D, de modo que pueda hacer la validación adecuada y luego, si la validación de entrada de fecha exitosa se almacena en A.D.
aquí está mi código para convertir la entrada de fecha en A.D
<?php
abstract class Request extends FormRequest
{
public function all()
{
$input = parent::all()
foreach ($input as $key=>$value)
{
if (substr($key, -5) == "_date")
{
$input[$key] = Helper::convert_in_ad($value);
}
}
return $input;
}
}
Ahora el problema es suponer que has falladovalidación y redirigir de nuevo a la acción anterior y luego usa old () o algún otro método para acceder a los datos de la solicitud de la sesión, se modificará y no puedo obtener los datos originales.
¿Cómo puedo cambiar la entrada de fecha en A.D cuando antes de la validación para que pueda validar correctamente en A.D y luego almacenar toda la entrada de fecha en A.D. al resolver el problema de validación fallida al modificar la entrada.
Editar pregunta
actualizar:
<?php
namespace AppHttpControllers;
use AppHttpRequests;
use AppHttpControllersController;
use AppRepositoriesContractsCourseInterface;
use AppRepositoriesContractsClassInterface;
use AppHttpRequestsClassRequest;
use AppHelpersHelper;
class ClassController extends Controller
{
public function __construct(ClassInterface $class, CourseInterface $course)
{
$this->class = $class;
$this->course = $course;
}
/**
* Display a listing of the resource.
*
* @return IlluminateHttpResponse
*/
public function index()
{
$classes = $this->class->paginate();
return view("backend.class.index")->with([
"classes" => $classes
]);
/*return view("backend.class.index")->with([
"classes" => $classes
]);*/
}
/**
* Show the form for creating a new resource.
*
* @return IlluminateHttpResponse
*/
public function create()
{
$courses = $this->course->all();
return view("backend.class.create")->with([
"courses" => $courses
]);
}
/**
* Store a newly created resource in storage.
*
* @param IlluminateHttpRequest $request
* @return IlluminateHttpResponse
*/
public function store(ClassRequest $request)
{
// dd($request->all());
$this->class->create($request->all());
return redirect()->route("classes.index");
}
/**
* Display the specified resource.
*
* @param int $id
* @return IlluminateHttpResponse
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return IlluminateHttpResponse
*/
public function edit($id)
{
$class = $this->class->find($id);
$courses = $this->course->all();
return view("backend.class.edit")->with([
"class" => $class,
"courses" => $courses
]);
}
/**
* Update the specified resource in storage.
*
* @param IlluminateHttpRequest $request
* @param int $id
* @return IlluminateHttpResponse
*/
public function update(ClassRequest $request, $id)
{
$class = $this->class->update($request->all(), $id);
return redirect()->back();
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return IlluminateHttpResponse
*/
public function destroy($id)
{
$this->class->delete($id);
return redirect()->route("classes.index");
}
public function delete($id)
{
$class = $this->class->find($id);
return view("backend.class.delete")->with([
"class" => $class
]);
}
}
Mi archivo de solicitud de clase
<?php
namespace AppHttpRequests;
use AppHttpRequestsRequest;
use AppHelpersHelper;
class ClassRequest extends Request
{
public function all()
{
$input = parent::all();
foreach ($input as $key=>$value)
{
if (substr($key, -5) == "_date")
{
$input[$key] = Helper::convert_in_ad($value);
}
}
return $input;
}
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
//$this->sanitize();
switch($this->method())
{
case "GET":
case "DELETE":
{
return [];
}
case "POST":
{
return [
"name" => "required",
"course_id" => "required",
"start_date" => "required|date",
"end_date" => "date|after:start_date",
];
}
case "PUT":
case "PATCH":
{
return [
"name" => "required",
"course_id" => "required",
"start_date" => "required|date",
"end_date" => "date|after:start_date",
];
}
default:break;
}
}
}
Para fines de validación necesito cambiar la fechade B.S en A.D porque la validación laraval no reconoce la fecha de B.S. Si convierto la fecha en el archivo de solicitud, el problema es que si la validación falla, obtengo la solicitud modificada nuevamente en el formulario después de la redirección.
Entonces, ¿cómo puedo validar la fecha convirtiéndola?en A.D. La fecha en la tabla de la base de datos debe almacenarse en formato A.D para poder usar Accessors and Mutators. El problema principal es cómo validar los datos que el usuario ingresó en formato B.S.
Editar Después de la sugerencia que recibí
Gracias a todos por la sugerencia, muchas gracias por su ayuda. Una forma en que puedo validar es haciendo una regla de validación personalizada como se sugiere. En este momento tengo otra idea para hacer que esto funcione.
<?php
namespace AppHttpRequests;
use IlluminateFoundationHttpFormRequest;
use AppHelpersHelper;
abstract class Request extends FormRequest
{
/**
* Sanitize input before validation
*
* @return array
*/
public function validator($factory)
{
return $factory->make(
$this->sanitizeInput(), $this->container->call([$this, "rules"]), $this->messages()
);
}
protected function sanitizeInput()
{
if (method_exists($this, "sanitize"))
{
return $this->container->call([$this, "sanitize"]);
}
return $this->all();
}
/**
* Check for input having _date for converting it into AD
*
* @return array
*/
public function sanitize()
{
$input = $this->all();
foreach ($input as $key=>$value)
{
if (substr($key, -5) == "_date")
{
$input[$key] = Helper::convert_in_ad($value);
}
}
return $input;
}
}
Al usar el siguiente código, los datos de solicitud no soncambiado Y no habrá necesidad de crear una validación personalizada y esto será fácil si luego decidí tomar la fecha en A.D del usuario y luego cambiar cada archivo de solicitud para actualizar la regla de validación no será necesario.
¿Qué piensas sobre esto?
Respuestas
0 para la respuesta № 1Como se mencionó en los comentarios, debe intentar evitar editar los datos en su FormRequest
.
Lo que podría hacer es definir una nueva regla de validación específicamente para esto: https://laravel.com/docs/5.3/validation#custom-validation-rules
Entonces, en tu app/Providers/AppServiceProvider
(u otro registrado ServiceProvider
) podrías tener algo como:
Validator::extend("bs_date", function ($attribute, $value, $parameters, $validator) {
$date = date_parse(Helper::convert_in_ad($value));
return checkdate($date["month"], $date["day"], $date["year"]);
}, "Your error message");
Validator::extend("bs_after", function ($attribute, $value, $parameters, $validator) {
$data = $validator->getData();
$before = Helper::convert_in_ad($data[$parameters["0"]]);
$after = Helper::convert_in_ad($value);
return (new DateTime($before)) < (new DateTime($after));
}, "Your error message");
Reglas
"start_date" => "required|bs_date",
"end_date" => "date|bs_after:start_date",
Obviamente, no te olvides de importar Validator
y Helper
en el ServiceProvider
.
Esto debería significar que ya no tiene que editar su entrada.
¡Espero que esto ayude!