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?


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.


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.


Isso faz sentido, e acho que o comentário do MPD também faz um bom argumento.
— Felix Eve
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.