Как загрузить модель в контроллер в MVC
Я работаю над созданием легкого MVC, в основном для процесса обучения, но мне бы хотелось, чтобы он был достаточно хорош для использования в конечном итоге.
Ниже приведен базовый пример/демонстрация того, как мог бы выглядеть базовый контроллер, давайте предположим, что URI был обработан и направлен на этот контроллер и эти 2 метода.
1) Мне нужно получить данные из базы данных/кэша/и т. Д.... Внутри моих классов моделей, мне просто нужна помощь в том, как я должен загружать свои модели в мой пример контроллера ниже, вы можете видеть, что я добавил это ниже $profileData = $this->model->getProfile($userId)
, которое только что придумано и не существует, как я мог заставить что-то подобное работать? Или мне следует загрузить модель в класс другим способом?
2) Для многих страниц потребуется, чтобы пользователь вошел на сайт. Должен ли я обработать эту часть ниже в контроллере, чтобы проверить, вошел ли пользователь в систему, например, перед созданием страницы профиля, проверьте, вошел ли пользователь в систему, если нет, то вместо этого создайте страницу входа и добавьте эти проверки внутри каждого метода/страницы контроллера?
/**
* Example Controller
*/
class User_Controller extends Core_Controller {
// domain.com/user/id-53463463
function profile($userId)
{
//GET data from a Model
$profileData = $this->model->getProfile($userId);
$this->view->load('userProfile', $profileData);
}
// domain.com/user/friends/
function friends()
{
//GET data from a Model
$friendsData = $this->model->getFriendlist();
$this->view->load('userFriends', $friendsData);
}
}
Ядро
abstract class Core_Controller {
protected $view;
protected $model;
function __construct(DependencyContainer $dependencyContainer){
$this->view = new Core_View();
//$this->view = $dependencyContainer->get(view);
}
}
1 answers
Вероятно, существует множество способов выполнить то, что вы пытаетесь.
"Проще всего", вероятно, просто переопределить конструктор и создать экземпляр модели напрямую.
В User_Controller:
public function __construct(DependencyContainer $dc) {
parent::__construct($dc);
$this->model = new User_Model();
}
Я предполагаю, что вы ищете что-то более автоматизированное, хотя. Если вы хотите, чтобы модель имела то же имя, что и контроллер, за вычетом "_controller", просто используйте get_class($this) в конструкторе и используйте строковые функции PHP для анализа того, что вы хотеть. Как только у вас есть это в переменной, вы можете использовать эту переменную для создания экземпляра модели:
В Core_Controller:
public function __construct(DependencyContainer $dc) {
$this->view = new Core_View();
// $model_class should be 'User_Model' now
$model_class = str_replace('_Controller', '_Model', get_class($this));
// now instantiate the model
$this->model = new $model_class();
}
На самом деле я не работал с какой-либо платформой, которая может иметь только одну модель, связанную с каждым контроллером (кроме may CakePHP? Я не могу вспомнить). В Symfony модели и контроллеры полностью разделены, поэтому вы можете использовать любую модель с любым контроллером. Вы просто создаете экземпляр модели по мере необходимости. Symfony использует доктрину ORM так, например, в действие контроллера, если бы вам нужна была модель, вы бы сделали что-то вроде этого:
$model = Doctrine::getTable('User');
Возможно, стоит рассмотреть более похожий дизайн, чтобы продвигать несвязанный дизайн, и я обещаю, что в какой-то момент вам понадобится более одной модели в каком-то контроллере.
2.) Что касается аутентификации. Что-то, что кажется довольно распространенным, - это наличие какой-то настройки (будь то в файле конфигурации или переменной-члене), которая указывает, выполняется ли текущее действие требуется, чтобы пользователь прошел проверку подлинности. Это обрабатывается каждый раз при выполнении действия (Yii вызывает фильтры такого рода). Если пользователю необходимо войти в систему, он сохраняет страницу, к которой он пытается получить доступ, а затем перенаправляет их на страницу входа в систему (вам нужно только создать ее). Как только они должным образом пройдут аутентификацию, он перенаправит их обратно туда, куда они направлялись изначально.