Модель/контроллер CodeIgniter и идентификатор пользователя

Мои модели в CodeIgniter должны проверять, что пользователь авторизован для выполнения данного действия. Внутри моделей я ссылался, используя $this->session->userdata['user_id'].

Мой вопрос: должен ли я устанавливать переменную в $this->session->userdata['user_id'] в контроллере и передавать ее в модель или просто проверять ее внутри модели?

Это даже имеет значение? Я полагаю, что передача $user_id в функцию сделает ее (немного) более читаемой. Какие аргументы и рекомендации за/против?


person Mark Unwin    schedule 23.11.2009    source источник


Ответы (2)


Вы можете выбирать между данными, которые являются фундаментальными для вашего приложения, и данными, которые являются случайными для данной функции-члена модели. Вещи, которые вы используете везде, должны быть гарантированы (базовые члены, глобальные переменные и т. д.), а вещи, используемые только в текущей функции, должны быть параметрами. Вы обнаружите, что использование подразумеваемых переменных (таких как $this->session->userdata) во многих местах ваших моделей и представлений быстро превратится в спагетти и будет непредсказуемым, если вы не загрузите их должным образом.

В свои проекты CodeIgniter я добавляю пользовательскую базовую модель и контроллер, которые наследуются от CI-фреймворка, добавляя свои собственные данные членов, которые используются везде в приложении. Я использую эти базовые классы для предоставления данных и функций, которые используют все мои модели и контроллеры (включая такие вещи, как userID). В конструкторе my_base_controller я вызываю базовый конструктор CI и устанавливаю данные, которые нужны всем моим контроллерам и представлениям. Это гарантирует предсказуемые значения по умолчанию для данных класса.

person Bruce Alderson    schedule 23.11.2009
comment
+1 Я делаю что-то подобное со своим базовым контроллером, поскольку идентификатор пользователя — это то, что в большинстве приложений вы будете везде проверять. - person Matthew Rapati; 24.11.2009

Строго говоря, $this->session->userdata['user_id'] принадлежит контроллеру.
Модели имеют дело только с данными... контроллеры по определению контролируют поток данных...
а аутентификация - это форма управления данными... (ИМХО)

Codewise, я следую этой процедуре

class MyControllerName extends Controller{
  function MyMyControllerName(){
    parent::Controller();
    $this->_user_id=$this->session->userdata['user_id']; //<-- define userid as a property of class
  }
}

А затем, скажем, одна из моих функций foo() требует аутентификации. Я бы сделал это

function foo(){
  $this->_checkAuthentication(); //should short out if not authenticated
  //rest of the function logic goes here
}

_checkAuthentication() может быть упрощенным, например:

function _checkAuthentication(){
  if(!isset($this->_user_id) && $this->_user_id<=0){ /or any other checks
    header("Location: ".base_url()."location_of/user_not_authorised_page");
    exit;
  }
}
person ekhaled    schedule 24.11.2009