Override user/%user page callback for a role I have done this by altering the 'page callback' for the path and then checking for the user role in the callback function. I am not sure if this is the best way to go about it.

function mymodule_hook_alter(&amp;$items) {
  // change callback for user view page to our dashboard function
  $items['user/%user']['page callback'] = '_client_dashboard';
}

/**
 * Callback function for menu item user/%
 */
function _client_dashboard($account) {
  global $user;
  // since we override user.module page callback for user/%user 
  // perform default function for users without client role
  if(!in_array('client', $user-&gt;roles)) {
    // return the function used by user.module passing in account
    return user_view_page($account);
  }
  return t('Dashboard');
}


I know you cannot have logic in hook_menu_alter since it's only called when caches cleared and stored in routing table.
The approach that you took is fine. It's one of the ways that you can control which page you have to show depending on (this case) the role.

Tip: take in consideration if "client" is going to be always the role allowed to see that page. If that could change in the future (add more roles or change to other), try to make it configurable.