Вы НИКОГДА не хотите иметь переменные сеанса в вашей модели.Вы всегда должны передавать эти переменные в качестве параметров функции в модели.Это также делает ваш код более расширяемым и гибким.Рассмотрим модель, которая получает пользователя по его идентификатору.Вы можете написать такую функцию, как:
function find_by_id() {
// SELECT * FROM Users WHERE user_id = $_SESSION['user_id'];
}
Тем не менее, что если вам сейчас нужно создать функциональность администратора с функцией поиска пользователя?Ваша модель жестко запрограммирована на использование user_id сеанса, но вы хотите иметь возможность передавать свой собственный идентификатор.Вам было бы лучше:
function find_by_id($id) {
// SELECT * FROM Users WHERE user_id = $id
}
и в вашем контроллере
$user = Model::find_by_id(1);
//or
$user = Model::find_by_id($_SESSION['user_id']);
//etc
В этом случае, однако, я бы действительно подумал сделать ваш код еще более гибким:
function find($ids) {
// this is pseudo code, but you get the idea
if(is_array($ids))
$ids = implode(',', $ids); // if an array of ids was passed, implode them with commas
SELECT * FROM Users WHERE user_id IN ($ids);
}
Это позволяет вам получить несколько пользователей в одном запросе!Что намного эффективнее.Затем, на ваш взгляд:
foreach($users as $user){
// iterate over each user and do stuff
}
Вам также следует рассмотреть возможность использования класса singelton для пользователя для ограничения загрузки базы данных.Создайте неизменяемый класс экземпляра с именем CurrentUser (например), например:
class CurrentUser {
private static $user;
// we never instantiate it -its singleton
private function __construct() {}
public function user() {
return self::$user;
}
}
Это действительно базовый пример одноэлементного класса, в котором пропущено множество вещей.Если вы хотите узнать больше о синглтон-классах, задайте другой вопрос.