php - validaciones - validar contraseña laravel
Marcadores de posición personalizados para reglas de validación personalizadas en Laravel 5 (3)
Creé un conjunto de reglas de validación personalizadas en mi aplicación Laravel. Primero creé un archivo validators.php
que se encuentra en el directorio de la App/Http
:
/**
* Require a certain number of parameters to be present.
*
* @param int $count
* @param array $parameters
* @param string $rule
* @return void
* @throws /InvalidArgumentException
*/
function requireParameterCount($count, $parameters, $rule) {
if (count($parameters) < $count):
throw new InvalidArgumentException("Validation rule $rule requires at least $count parameters.");
endif;
}
/**
* Validate the width of an image is less than the maximum value.
*
* @param string $attribute
* @param mixed $value
* @param array $parameters
* @return bool
*/
$validator->extend(''image_width_max'', function ($attribute, $value, $parameters) {
requireParameterCount(1, $parameters, ''image_width_max'');
list($width, $height) = getimagesize($value);
if ($width >= $parameters[0]):
return false;
endif;
return true;
});
A continuación, agrego esto incluido en mi archivo AppServiceProvider.php
(mientras también agrego el use Illuminate/Validation/Factory;
en la parte superior de este archivo):
public function boot(Factory $validator) {
require_once app_path(''Http/validators.php'');
}
Luego, en mi archivo de solicitud de formulario, puedo llamar a la regla de validación personalizada, así:
$rules = [
''image'' => ''required|image|image_width:50,800'',
];
Luego, en el archivo Laravel validation.php
ubicado en el directorio resources/lang/en
, agrego otra clave / valor a la matriz para mostrar un mensaje de error si la validación devuelve falso y falla, así:
''image_width'' => ''The :attribute width must be between :min and :max pixels.'',
Todo funciona bien, comprueba la imagen correctamente, muestra el mensaje de error si falla, pero no estoy seguro de cómo reemplazar :min
y :max
con los valores declarados en el archivo de solicitud de formulario (50,800), de la misma manera :attribute
se reemplaza con el nombre del campo de formularios. Por lo tanto, actualmente muestra:
The image width must be between :min and :max pixels.
Mientras que quiero que se muestre así
The image width must be between 50 and 800 pixels.
He visto algunas funciones de replace*
en el archivo maestro Validator.php
(vendor/laravel/framework/src/Illumiate/Validation/)
, pero no puedo entender cómo hacerlo funcionar con mi propio sistema personalizado regla de validación.
No lo he usado así, pero probablemente puedas usar:
$validator->replacer(''image_width_max'',
function ($message, $attribute, $rule, $parameters) {
return str_replace(['':min'', '':max''], [$parameters[0], $parameters[1]], $message);
});
Aquí hay una solución que utilicé:
En composer.json:
"autoload": {
"classmap": [
"app/Validators"
],
En App / Providers / AppServiceProvider.php:
public function boot()
{
$this->app->validator->resolver(
function ($translator, $data, $rules, $messages) {
return new CustomValidator($translator, $data, $rules, $messages);
});
}
En App / Validators / CustomValidator.php
namespace App/Validators;
use Illuminate/Support/Facades/DB;
use Illuminate/Validation/Validator as Validator;
class CustomValidator extends Validator
{
// This is my custom validator to check unique with
public function validateUniqueWith($attribute, $value, $parameters)
{
$this->requireParameterCount(4, $parameters, ''unique_with'');
$parameters = array_map(''trim'', $parameters);
$parameters[1] = strtolower($parameters[1] == '''' ? $attribute : $parameters[1]);
list($table, $column, $withColumn, $withValue) = $parameters;
return DB::table($table)->where($column, ''='', $value)->where($withColumn, ''='', $withValue)->count() == 0;
}
// All you have to do is create this function changing
// ''validate'' to ''replace'' in the function name
protected function replaceUniqueWith($message, $attribute, $rule, $parameters)
{
return str_replace(['':name''], $parameters[4], $message);
}
}
: name es replace by $ parameters [4] en esta función replaceUniqueWith
En App / resources / lang / en / validation.php
<?php
return [
''unique_with'' => ''The :attribute has already been taken in the :name.'',
];
En mi controlador, llamo a este validador así:
$organizationId = session(''organization'')[''id''];
$this->validate($request, [
''product_short_title'' => "uniqueWith:products,short_title,
organization_id,$organizationId,
Organization",
]);
Esto es lo que parece en mi forma :)
Estoy usando algo como esto en Laravel 5.4:
AppServiceProvider.php
public function boot()
{
/Validator::extend(''contains_field'', ''App/Validators/ContainsFieldValidator@validate'');
/Validator::replacer(''contains_field'', ''App/Validators/ContainsFieldValidator@replace'');
}
App / Validators / ContainsFieldValidator.php
class ContainsFieldValidator
{
public function validate($attribute, $value, $parameters, Validator $validator)
{
$required = $parameters[0];
$requiredDefault = isset($parameters[1]) ?: null;
if (!$required && !$requiredDefault) {
return false;
}
$requiredValue = isset($validator->attributes()[$required]) ? $validator->attributes()[$required] : $requiredDefault;
return !(strpos($value, $requiredValue) === false);
}
public function replace($message, $attribute, $rule, $parameters)
{
return str_replace(['':required''], str_replace(''_'', '' '', $parameters[0]), $message);
}
}