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?