O redirecionamento de usuários no retorno de chamada de acesso do hook_menu teria efeitos indesejáveis?

8

Essa resposta levou a uma discussão sobre a melhor maneira de redirecionar um usuário para uma página específica, se ele não deveria ter acesso à página que está tentando acessar.

Uma opção é definir o retorno de chamada de acesso como true e redirecionar os usuários no retorno de chamada da página. Embora isso pareça válido, acho que está misturando a funcionalidade de acesso à funcionalidade de criação de página no retorno de chamada da página.

Por exemplo

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
}

Outra opção é definir a função de retorno de chamada de acesso para chamar uma função que verifica se o usuário tem acesso, mas, em vez de retornar falso, redireciona o usuário para outra página. Isso é bom porque está separando a lógica de acesso e a lógica de criação de página. No entanto, o objetivo de um retorno de chamada de acesso é retornar um valor booleano, portanto, isso está quebrando essa lógica redirecionando o usuário.

Por exemplo

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;
}

Existem efeitos indesejáveis ​​ao redirecionar usuários no retorno de chamada de acesso que eu não conheço?

O que você acha que é a melhor prática aqui?

Felix Eve
fonte
adicionar mais um golpe ao comentário php na página callback :) destaque de sintaxe não está funcionando bem
xurshid29
5
Eu acho, mas não sou positivo, que se você adicionar esse caminho a um menu, algumas coisas muito estranhas acontecerão b / c, o retorno de chamada de acesso é usado para descobrir se o item de menu pode ser exibido para um usuário específico.
mpdonadio

Respostas:

6

Eu acho que você poderia fazer isso alterando a função de retorno de chamada de entrega. Se o retorno de chamada de acesso retornar, FALSEé isso que é passado para o retorno de chamada de entrega. Se você quiser esse comportamento de redirecionamento apenas em páginas específicas, poderá modificar o retorno de chamada de entrega apenas para essas páginas via hook_menu()ou hook_menu_alter(). Se você deseja que o comportamento seja global, use a hook_page_delivery_callback_alter()para alterá-lo.

Aqui está um exemplo de retorno de chamada 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);
 }

Mas isso não foi testado e eu nunca alterei o retorno de chamada de entrega antes.

Andy
fonte
Isso soa como uma abordagem interessante ...
Felix Eve
Confirmado que isso funciona. Muito mais limpo do que redirecionar no retorno de chamada de acesso. Adicione a hook_menu_alter:$items['player/my_page']['delivery callback'] = 'player_my_page_delivery';
wxactly
3

Eu não faria isso no retorno de chamada de acesso. Se outro desenvolvedor quiser alterar o arquivo page_callbackem algum momento no futuro, ele acabará coçando a cabeça por que o retorno de chamada não está funcionando quando você está redirecionando no retorno de acesso.

awm
fonte
Isso faz sentido, e acho que o comentário do MPD também faz um bom argumento.
Felix Eve