/ / Datos de solicitud de cambio de Laravel en clase de solicitud de formulario - laravel, laravel-5

Datos de solicitud de cambio de Laravel en clase de solicitud de formulario - laravel, laravel-5

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 № 1

Como 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!