Laravel 5.4 #7 : Middlewares y relaciones con Eloquent ORM

Hay veces que ciertos usuarios no quieres que accedan a ciertas partes de la web, ya sea por su rol, porque no son ellos los creadores o por el motivo que sea. Laravel tiene una característica que nos permite hacer esto muy fácilmente, los llamados Middlewares. Esto es lo que vamos a tratar hoy, juntamente con las relaciones de campos de la base de datos con Eloquent ORM. Es decir, aprenderemos a asignar un post al usuario creador y después cómo acceder a ese dato.

 

Asignar un post al usuario creador

Primero de todo tenemos que asociar al post un usuario, eso lo vamos a hacer a través de un campo de en la tabla posts que se llame user_id. Para crearlo, como siempre, tenemos que crear una migración:

Lo abrimos:

Ejecutamos la migración:

Ahora tenemos que modificar los modelos tanto de post como de usuario, para indicarles que hay una relación entre estas dos tablas a través del campo user_id.

Abrimos el modelo de usuario y le añadimos este método:

Abrimos el modelo de post y quedará así:

Ya hemos indicado que hay una relación en la base de datos entre estas dos tablas.

 

Ahora vamos a ocultar el formulario de envío de posts si no estas logueado, porque ahora no tendrá sentido que se muestre, ya que cuando se intente guardar el post no podrá acceder al id del usuario creador, porque no habrá ningún usuario logueado. Abrimos el fichero donde está el formulario y ponemos así los dos includes. Con esto ya quedará oculto si no estás logueado:

Ahora simplemente queda modificar el método de creación de posts y añadir el id del usuario creador, que será el id del usuario que ha iniciado sesión.

Y ya estaría guardándose el id del usuario creador y ocultándose el formulario de creación de posts.

Si queremos mostrar el usuario, tendremos que poner esta línea en las vistas que queramos:

 

Puedes encontrar más información sobre los diferentes tipos de relaciones y más cosas, aquí.

 

Middlewares

Un middleware es una función que se ejecuta antes de entrar a la URL que nos dirigimos, es decir, actúa como un filtro y deja pasar a quien cumpla con los requisitos que nosotros pongamos.

Por ejemplo, no tiene sentido que alguien que no está logueado pueda entrar a la URL POST (método store) de creación de posts, por tanto, vamos a restringir el acceso para que sólo puedan entrar usuarios que hayan iniciado sesión. Abrimos el controlador y añadimos este constructor:

Estamos diciendo que se aplique el middleware auth (ya viene en Laravel) solamente al método store.

Ya hemos restringido el acceso.

 

Pero hay veces que no sirve simplemente con hacer una comprobación de si está logueado o no, a lo mejor queremos comprobar su rol, de que país es, etc., etc. Entonces, debemos crear un middleware personalizado. Para ello, como siempre, Laravel nos provee de un comando que nos crea el middleware en la carpeta adecuada muy fácilmente.

Nota: este middleware lo utilizaremos más adelante cuanto hagamos la edición y eliminación de posts. Aunque hay otras maneras mejores (por ejemplo, policies) que ya explicaremos y aplicaremos, de momento ésta nos sirve.

Se nos habrá creado un archivo en la carpeta middleware. Lo abrimos y ponemos lo siguiente:

Comprobamos si es el creador de ese post y si es, lo dejamos pasar, si no lo redirigimos al listado. Aún nos falta registrarlo para eso abrimos el archivo Kernel.php y añadimos esta línea al array de middlewares:

Para utilizarlo debemos emplear la sintaxi expuesta antes para añadir los middlewares, también puedes mirar aquí que hay otras manera de hacerlo.


Aloja tu proyecto en DigitalOcean: Obtén $200 de crédito gratis al registrarte a través de este enlace.

Si hay cualquier tipo de error en el post o te surge cualquier duda, no dudes en ponerlo en los comentarios o enviarme un correo desde la página de contacto.

? CONTACTAR

5 comentarios en “Laravel 5.4 #7 : Middlewares y relaciones con Eloquent ORM

  1. Hola de nuevo, y perdon por la molestia pero en esta parte del ejercicio me marca este error que no he podido solucionar «ReflectionException
    Class App\Http\Controllers\StorePost does not exist», ya intente agrear en el controlador la linea use app\http\\controllers\storepost; pero aun no funciona espero que me puedas ayudar de antemano gracias 😀

    1. Hola Billy,

      Gracias por tu comentario!

      He estado mirando el error que me comentas y es un error mío, ya que cambié el nombre del Request StorePost a PostRequest y se me pasó cambiarlo en esta parte de código. Perdona por la confusión, ahora lo cambio para que esté bien, gracias por decirmelo.

      Si has seguido los posts ya deberías haber puesto esta línea, pero por si acaso lo correcto sería (lo puedes ver en este post):
      use App\Http\Requests\PostRequest;

      Un saludo, en estos días subiré a mi cuenta de GitHub todo el código del proyecto para que podáis verlo.

      1. Hola! gracias ahora si ya pude resolverlo, tambien le agregue la linea «use Auth;» que me marcaba error , hasta aqui todo bien muchas gracias te debo una 😀

  2. Hola a mi me da este error «ErrorException
    Trying to get property of non-object
    in Owner.php (line 22)» que seria esta «if ($post->user_id != Auth::user()->id)» he estado investigando y no he podido resolverlo, espero me puedas ayudar

    1. Hola Jose Luis,

      Es porque está intentando acceder al usuario (Auth::user()) mientras que el usuario no existe porque no estás logueado con ningún usuario.

      Si te fijas hay una Nota en el artículo que dice que lo utilizaremos más adelante. Si vas a la sección Eliminar de ese post, verás que ya se utiliza y lo que hace es añadir antes el middleware auth, que comprueba que el usuario esté logueado y así, si no está logueado ya no entra en esa parte de código, porque te redirige antes.

      Un saludo!

Deja una respuesta

  Acepto la política de privacidad