spatie - Cómo verificar el usuario es administrador o no en la vista de hoja laravel
roles de usuario laravel 5 (5)
Entonces tienes un campo isAdmin si es 1, por ejemplo, el usuario es administrador, si no es así. Cuando el usuario está conectado, verifique con (Auth::user()->isAdmin == 1)
entonces el usuario es el administrador, de lo contrario no es
con Auth::user()->
puede verificar cualquier campo de la tabla de usuarios del usuario registrado actual.
Atentamente
yo tengo
Tabla de usuario como
+==============+ | User | +==============+ | id | +--------------+ | firstname | +--------------+ | lastname | +--------------+ | email | +--------------+ | password | +--------------+
y mi tabla de roles
+==============+ | Roles | +==============+ | id | +--------------+ | name | +--------------+
y mi tabla role_user es
+=============+ | role_user | +=============+ | user_id | +-------------+ | role_id | +-------------+
¿Cómo puedo verificar que el usuario registrado actual sea administrador o usuario normal?
Necesita agregar una relación de roles
en su modelo de User
manera:
public function roles()
{
return $this->belongsToMany(App/Role::class);
}
y ahora necesitas crear el usuario de isAdmin
así:
public function isAdmin()
{
return in_array(1, $this->roles()->pluck(''role_id'')->all());
}
Como 1
, pones el id de tu rol de administrador. Por supuesto, también podría definirse de otra manera, pero todo depende de cómo se usará.
También podría definirse de esta manera:
public function isAdmin()
{
return $this->roles()->where(''role_id'', 1)->first();
}
y ahora en tu Blade puedes hacer:
@if (auth()->check())
@if (auth()->user()->isAdmin()
Hello Admin
@else
Hello standard user
@endif
@endif
No es una ACL para esta funcionalidad simple. Ni siquiera necesita los roles
una tabla de base de datos. Puede agregar una columna de status
adicional de tinyInteger
y agregar números, por ejemplo:
- 0 = Deshabilitado
- 1 = Visitante
- 2 = Admin.
Para que sea funcional, agregue el siguiente código a su User.php
.
public function isDisabled ()
{
return $this->statusCheck();
}
public function isVisitor ()
{
return $this->statusCheck(1);
}
public function isAdmin ()
{
return $this->statusCheck(2);
}
protected function statusCheck ($status = 0)
{
return $this->status === $status ? true : false;
}
Para verificar la plantilla de la blade
puede agregar
@if(Auth::user()->isDisabled())
You are not Active
@elseif(Auth::user()->isVisitor())
Welcome to example.com
@elseif(Auth::user()->isAdmin())
Welcome Admin
@endif
Además, puede crear directivas personalizadas blade, pegar este código en su app/providers/AppServiceProvider.php
en boot()
método boot()
.
// Blade custom directives for isAdmin
Blade::directive(''isAdmin'', function() {
return "<?php if(Auth::user()->isAdmin()): ?>";
});
Blade::directive(''endisAdmin'', function() {
return "<?php endif; ?>";
});
// Blade custom directives for isVisitor
Blade::directive(''isVisitor'', function() {
return "<?php if(Auth::user()->isVisitor()): ?>";
});
Blade::directive(''endisVisitor'', function() {
return "<?php endif; ?>";
});
// Blade custom directives for isDisabled
Blade::directive(''isDisabled'', function() {
return "<?php if(Auth::user()->isDisabled()): ?>";
});
Blade::directive(''endisDisabled'', function() {
return "<?php endif; ?>";
});
Para llamar a esto, use la necesidad de escribir las siguientes líneas en su blade view
@isAdmin()
Welcome Admin
@endisAdmin
@isVisitor()
Welcome to example.com
@endisVisitor
@isDisabled()
Your are not active
@endisDisabled
En resumen, laravel le proporciona una serie de formas de resolver un problema, solo depende de su necesidad y estructura de la aplicación.
Role.php
use Illuminate/Database/Eloquent/Model;
class Role extends Model {
protected $fillable = [
''name''
];
/**
* A role can have many users.
*
* @return /Illuminate/Database/Eloquent/Relations/BelongsToMany
*/
public function users() {
return $this->belongsToMany(''App/User'');
}
}
Luego puede agregar esto al modelo de Usuario :
public function isAdmin()
{
foreach ($this->roles()->get() as $role)
{
if ($role->name == ''Admin'')
{
return true;
}
}
}
Ver
@if(Auth::check())
@if (Auth::user()->isAdmin())
<h2>Admin user enter code here<h2>
@endif
@endif
los métodos compartidos funcionan. el problema es que si tiene que verificar más de una vez por página, muchas veces golpea la base de datos. por ejemplo, digamos que tiene una navegación con 8 enlaces. los enlaces primero, cuarto y séptimo solo deberían ser visibles por el administrador. esa consulta golpeará su base de datos 3x. tal vez solo soy anal pero es una solicitud duplicada.
Estoy tratando de encontrar otra forma de almacenar una variable que se carga una vez en la vista / plantilla para que cada vez que necesite verificar si es un administrador, revise la variable y no acceda a la base de datos cada vez. Lo hice a través del controlador -> ver, pero no solo ver solo en una plantilla. Estoy pensando en crear un método de ayuda y devolver un objeto que se comprobará una vez por carga de página.