¿Redirigir a los usuarios en la devolución de llamada de acceso de hook_menu tendría algún efecto no deseado?

8

Esta respuesta condujo a una discusión sobre la mejor manera de redirigir a un usuario a una página específica si no deberían tener acceso a la página a la que intentan acceder.

Una opción es establecer la devolución de llamada de acceso en verdadero y luego redirigir a los usuarios en la devolución de llamada de la página. Si bien esto parece válido, creo que combina la funcionalidad de acceso con la funcionalidad de creación de páginas en la devolución de llamada de la página.

P.ej

function hook_menu() {
    $items['player/my_page'] = array(
        'title' => t('My Page'), // note this is a required parameter
        'access callback' => TRUE,
        'page callback' => 'some_function',
    );
    return $items;
}

function some_function() {
    global $user;   
    if(!$user->uid) { // here checking if the user is logged in but could be checking for a specific permission or field value
        $dest = drupal_get_destination();
        drupal_goto('user/login', $dest); // this remembers where the user is coming from
    }
    // carry on building rest of page
}

Otra opción es configurar la función de devolución de llamada de acceso para llamar a una función que verifica si el usuario tiene acceso, pero luego, en lugar de devolver falso, redirigirá al usuario a otra página. Esto es bueno ya que separa la lógica de acceso y la lógica de creación de páginas. Sin embargo, el propósito de una devolución de llamada de acceso es devolver un valor booleano, por lo que esto está rompiendo esa lógica al redirigir al usuario.

P.ej

function hook_menu() {
    $items['player/my_page'] = array(
        'title' => t('My Page'), // note this is a required parameter
        'access callback' => 'check_access',
        'page callback' => 'some_function',
    );
    return $items;
}

function check_access() {
    global $user;
    // here checking if the user is logged in but could be checking for a specific permission or field value
    if(!$user->uid) {
        $dest = drupal_get_destination();
        drupal_goto('user/login', $dest);
    }
    return TRUE;
}

¿Hay algún efecto indeseable al redirigir a los usuarios en la devolución de llamada de acceso que desconozco?

¿Cuál crees que es la mejor práctica aquí?

Víspera de felix
fuente
agregue una barra más al comentario de php en la devolución de llamada de la página :) el resaltado de sintaxis no funciona bien
xurshid29
55
Creo, pero no estoy seguro, que si agrega esta ruta a un menú, sucederán cosas muy raras porque la devolución de llamada de acceso se usa para determinar si el elemento de menú se puede mostrar para un usuario en particular.
mpdonadio

Respuestas:

6

Creo que podría hacer esto alterando la función de devolución de llamada de entrega. Si la devolución de llamada de acceso regresa, FALSEeso es lo que se pasa a la devolución de llamada de entrega. Si desea este comportamiento de redireccionamiento solo en páginas específicas, puede modificar la devolución de llamada de entrega solo para esas páginas a través de hook_menu()o hook_menu_alter(). Si desea que el comportamiento sea global, puede usar a hook_page_delivery_callback_alter()para cambiarlo.

Aquí hay un ejemplo de devolución de llamada de entrega.

function custom_deliver_html_page($page_callback_result) {
  if ($page_callback_result === MENU_ACCESS_DENIED) {
    drupal_goto('<front>');
  }
  drupal_deliver_html_page($page_callback_result);
 }

Por cierto, esto no se ha probado, y nunca antes había alterado la devolución de llamada de entrega.

Andy
fuente
Esto suena como un enfoque interesante ...
Felix Eve
Confirmado esto funciona. Mucho más limpio que redirigir en la devolución de llamada de acceso. Agregar a hook_menu_alter:$items['player/my_page']['delivery callback'] = 'player_my_page_delivery';
wxactly
3

No lo haría en la devolución de llamada de acceso. Si otro desarrollador quiere alterarlo page_callbacken algún momento en el futuro, terminarán rascándose la cabeza de por qué la devolución de llamada no funciona cuando se redirige en la devolución de llamada de acceso.

awm
fuente
Esto tiene sentido, y creo que el comentario de MPD también tiene un buen punto.
Felix Eve