hook_menuのアクセスコールバックでユーザーをリダイレクトすると、望ましくない影響がありますか?


8

この回答は、ユーザーがアクセスしようとしているページへのアクセスを許可されていない場合に、ユーザーを特定のページにリダイレクトする最良の方法についての議論につながりました。

1つのオプションは、アクセスコールバックをtrueに設定してから、ページコールバックでユーザーをリダイレクトすることです。これは有効なようですが、ページコールバックでアクセス機能とページ作成機能を混在させていると思います。

例えば

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
}

別のオプションは、ユーザーがアクセス権を持っているかどうかをチェックする関数を呼び出すようにアクセスコールバック関数を設定することですが、falseを返す代わりに、ユーザーを別のページにリダイレクトします。アクセスロジックとページ作成ロジックを分離しているので、これは良いことです。ただし、アクセスコールバックの目的はブール値を返すことなので、これはユーザーをリダイレクトすることによってそのロジックを壊しています。

例えば

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

私が知らないアクセスコールバックでユーザーをリダイレクトすることによる望ましくない影響はありますか?

ここでのベストプラクティスは何だと思いますか?


ページコールバックのphpコメントにスラッシュをもう1つ追加します:)構文の強調表示がうまく機能しません
xurshid29

5
このパスをメニューに追加すると、非常に奇妙なことが起きると思いますが、アクセスコールバックを使用して、メニュー項目を特定のユーザーに表示できるかどうかを判断します。
mpdonadio

回答:


6

配信コールバック関数を変更することでこれを行うことができると思います。アクセスコールバックが返さFALSEれた場合、それが配信コールバックに渡されます。特定のページのみでこのリダイレクト動作が必要な場合は、hook_menu()またはを介して、それらのページのみの配信コールバックを変更できますhook_menu_alter()。動作をグローバルにしたい場合は、a hook_page_delivery_callback_alter()を使用して変更できます。

これが配信コールバックの例です。

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

ところで、これはテストされておらず、実際に配信コールバックを自分で変更したことはありません。


これは興味深いアプローチのように聞こえます...
Felix Eve

これが機能することを確認しました。アクセスコールバックでリダイレクトするよりもクリーンです。追加hook_menu_alter$items['player/my_page']['delivery callback'] = 'player_my_page_delivery';
wxactly '26 / 09/26

3

アクセスコールバックでは行いません。別の開発者page_callbackが将来のある時点でを変更したい場合、アクセスコールバックでリダイレクトしているときにコールバックが機能しない理由について頭を悩ますことになります。


これは理にかなっており、MPDのコメントも適切だと思います。
Felix Eve
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.