validar validaciones validacion reglas personalizadas example custom contraseña array php laravel laravel-5 laravel-validation

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); } }