Archivos de Categoría: Laravel 5 - Paginas 4

Validación en Laravel 5 según el método de recepción de los parámetros

Es habitual que al validar un formulario de usuarios por ejemplo, de cara al alta y a la modificación de un registro, comprobemos que no se puedan insertar emails duplicados en la base de datos. Si usamos los métodos estándar que usa Laravel para el alta y modificación sabremos que los datos nos llegan por POST cuando es un nuevo registro, y por PUT cuando es una modificación. Para ello en el request que usemos para validar los datos (en mi caso app\Http\Request\AdminUserRequest.php) pondremos las reglas de la siguiente forma:

public function rules()
{
	switch($this->method())
	{
		case 'POST': 
		{
/* es el alta de un usuario por lo que el email debe ser único y la contraseña obligatoria */
			return [
				'name' => 'required|max:255',
				'email' => 'required|email|max:255|unique:users',
				'password' => 'required|confirmed|contrasena_segura',
				'role'	=> 'required|in:superadmin,admin,user'
			];
		}
		case 'PUT':
		{
/* es la modificación de un registro por lo que el email debe ser unico sin contarse a si mismo, 
y la contraseña no es obligatoria ya que si no existe el parámetro, no la vamos a modificar */
			return [
				'name' => 'required|max:255',
				'email' => 'required|email|max:255|unique:users,email,'.$this->usuario,
				'password' => 'confirmed|contrasena_segura',
				'role'	=> 'required|in:superadmin,admin,user'
			];
		}
		default: return [];
	}
}

Crear función de validación propia en Laravel 5

Laravel 5 viene con un fantástico sistema de validación de datos con un montón de reglas de validación predefinidas que podemos ver en https://laravel.com/docs/5.0/validation#available-validation-rules pero lo normal es que necesitemos crear nuestras propias reglas de validación para ciertos campos. En mi caso surgió la necesidad de validar que las contraseñas cumplieran ciertas reglas (que tengan al menos una mayúscula, minúscula, número y una longitud entre 6 y 10 caracteres). Para ello en el fichero app\Providers\AppServiceProvaider.php, dentro de la función boot me cree una extensión del validador de la siguiente forma:

namespace MiProyecto\Providers;
use Illuminate\Support\ServiceProvider;

use Validator; // añadir esta línea, importante

class AppServiceProvider extends ServiceProvider {
	/**
	 * Bootstrap any application services.
	 *
	 * @return void
	 */
	public function boot()
	{
		// la validación que queremos crear
		Validator::extend('contrasena_segura', function($attribute, $value, $parameters, $validator) {
			return (preg_match('/(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9\s]{6,10})$/', $value) == 1)?true:false;
		});
	}

	

Luego tenemos que definir el mensaje de error que se va a mostrar en caso de error, lo cual podremos hacer en el fichero validation.php del idioma que estemos usando (resources\lang\es\validation.php en mi caso):

  'contrasena_segura'  => 'La contraseña debe tener entre 6 y 10 caracteres, y contener alguna mayúscula, minúscula y número',

Y ya lo podremos usar como cualquier otro tipo de validación:

$validator = Validator::make($request->input(), [
	'name' => 'required|max:255',
	'email' => 'required|email|max:255|unique:users,email,'.$request->input('id'),
	'password' => 'required|contrasena_segura',
	'role'	=> 'required|in:superadmin,admin,user'
]);	

Depurar consulta en Laravel 5 sin la barra de depuración

A parte de la maravillosa barra de depuración que nos ofrece Laravel 5, podemos necesitar un log de las consultas que vamos haciendo. La forma más sencilla es con un evento:

Event::listen('illuminate.query', function($query){
var_dump($query);
});

Pero el otro día estaba montando un comando y no se ejecutaba correctamente la consulta que quería por lo que me toco usar otro método distinto, activando el log del propio query builder de Laravel:

DB::enableQueryLog();
// Aquí la query que queramos rastrear
$laQuery = DB::getQueryLog();
$this->info('query:' . $laQuery[0]['query']);
DB::disableQueryLog();