Drupal 8: Crear roles y asignarles permisos mediante código

Cabecera - Drupal 8: Crear roles y asignarles permisos mediante código

Drupal 8: Crear roles y asignarles permisos mediante código

  • Autor: fjavimartin

  • Fecha de Creación: 10/01/2019

  • Categorías:

    • Drupal,
    • Drupal 8,
    • Roles,
    • Permisos,
    • Code snippets

En este artículo vamos a crear roles en drupal 8 y asignarles permisos mediante código. La idea es que en nuestros módulos podamos añadir los roles que necesitemos en el hook_install() y además les asignemos los permisos que hayamos declarado.

1. Declaración de permisos

El primer paso será la creación de los permisos que estimemos necesarios para nuestro módulo. Esta es la parte más fácil puesto que bastará con añadir un archivo modulo.permission.yml al directorio raíz de nuestro módulo con los diferentes permisos.

'modulo admin':
  title: modulo admin
  description: Administrador de nuestro módulo.

'modulo usuario':
  title: modulo usuario
  description: Usuario de nuestro módulo.

La estructura de este fichero es bastante sencilla, solamente necesitamos el identificador de cada permiso, debajo añadiremos el título y la descripción que finalmente nos mostrará drupal.

2. Añadir el hook_install() a nuestro módulo

El hook_install() deberemos darlo de alta en el fichero modulo.module y se ejecutará cuando realicemos la instalación de nuestro módulo:

/**
 * Implements hook_install().
 * 
 * Add roles.
 */
function efichajes_install() {
  // Create efichajes roles and asign his own permission.
  $role = \Drupal\user\Entity\Role::create(array('id' => 'modulo_admin', 'label' => 'modulo - Admin'));
  $role->grantPermission('modulo admin');
  $role->save();
  drupal_set_message(
      t('@label rol created.', 
          ['@label' => $role->get('label')])
  );
  
  $role = \Drupal\user\Entity\Role::create(array('id' => 'modulo_usuario', 'label' => 'modulo - usuario'));
  $role→grantPermission('modulo usuario');
  $role->save();
  drupal_set_message(
      t('@label rol created.',
          ['@label' => $role->get('label')])
  );
}

El concepto de entidad está muy extendido en drupal 8 y los roles no podían ser una excepción. Si buceamos un poco dentro de la api llegaremos a la siguiente url:

https://api.drupal.org/api/drupal/core!modules!user!src!Entity!Role.php/...

La clase Role hereda de la clase ConfigEntityBase que nos aporta una serie de métodos estáticos que nos permiten la creación de una entidad, en este caso de un rol.

Si continuamos mirando la documentación veremos que los atributos de un rol son:

/**
   * The machine name of this role.
   *
   * @var string
   */
  protected $id;

  /**
   * The human-readable label of this role.
   *
   * @var string
   */
  protected $label;

  /**
   * The weight of this role in administrative listings.
   *
   * @var int
   */
  protected $weight;

  /**
   * The permissions belonging to this role.
   *
   * @var array
   */
  protected $permissions = array();

  /**
   * An indicator whether the role has all permissions.
   *
   * @var bool
   */
  protected $is_admin;

Con esto tenemos todos lo necesario para crear un rol. Al método para crear un entidad solamente tendremos que pasarle un array con los valores para los atributos que acabamos de ver.

Ya tenemos nuestro nuevo rol creado, nos quedará asignarle el permiso que estimemos oportuno y para ello utilizaremos el método grantPermission() que también encontraremos en la documentación de la clase Role. Solamente será necesario pasar el id del permiso necesario y que previamente hemos dado de alta mediante el fichero modulo.permissions.yml.

Una vez tenemos el rol creado y asignado el permiso llamaremos el método save() para guardar definitivamente la entidad. Muy importante la llamada a este método, en caso contrario no se guardará nuestra entidad.

3. Añadimos hook_uninstall() a nuestro módulo

Cuando desinstalemos nuestro módulo tendremos que eliminar los roles que hemos creado anteriormente por lo que deberemos añadir el hook_uninstall() al fichero modulo.module:

/**
 * Implements hook_uninstall().
 * 
 * Remove roles.
 */
function efichajes_uninstall(){
  // Remove efichajes roles
  $roles = \Drupal\user\Entity\Role::loadMultiple(array('modulo_admin', 'modulo_worker'));
  foreach ($roles as $role) {
    $rol_label = $role->get('label');
    $role->delete();
    drupal_set_message(t('@label rol removed.',
        [ '@label' => $rol_label ])
    );
  }
}

De la misma que disponemos del método create() también dispondremos de los métodos load() o loadMultiple() para todas las entidades. En nuestro caso utilizaremos el método loadMultiple() al que le pasaremos un array con los id’s de nuestros roles y recorreremos el array eliminando los roles creados.

4. Conclusiones

Ya habéis visto que la creación/eliminación de roles es muy sencilla, eso sí, quizás al principio os parezca algo complicado ir tirando del hilo para encontrar los diferentes métodos que debéis utilizar con cada entidad por lo que os aconsejo que os familiaricéis con toda la documentación que encontraréis en la api de drupal.

Disfrutar!!!!!!!!

 

Referencias

https://api.drupal.org/api/drupal/core!modules!user!src!Entity!Role.php/class/Role/8.2.x

https://www.drupal.org/node/2311427

Todos los Derechos Reservados © 2016

Funciona con Drupal