Как загрузить модель в контроллер в MVC - PullRequest
5 голосов
/ 07 сентября 2011

Я работаю над созданием легковесного MVC, в основном для учебного процесса, но мне бы хотелось, чтобы он был достаточно хорош для последующего использования.

Ниже приведен базовый пример / демонстрация того, как базовый контроллер мог быПосмотрим, давайте предположим, что URI был обработан и направлен на этот контроллер и эти 2 метода.

1) Мне нужно получить данные из базы данных / кэша / и т. Д. ... в моих классах Model, мне просто нужна помощь о том, как мне загрузить мои модели в мой пример контроллера ниже, вы можете видеть, что у меня естьдобавил это ниже $profileData = $this->model->getProfile($userId), который только что составлен и не существует, как я мог заставить что-то подобное работать, хотя?Или я должен загрузить модель в класс другим способом?

2) На многих страницах требуется, чтобы пользователь вошел на сайт.Должен ли я обрабатывать эту часть ниже в контроллере, чтобы проверить, вошел ли пользователь в систему, например, перед созданием страницы профиля, проверить, вошел ли пользователь, если нет, то вместо этого создать страницу входа в систему и добавить эти проверки внутри каждого метода контроллера/ page?

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

core

abstract class Core_Controller {
    protected $view;
    protected $model;

    function __construct(DependencyContainer $dependencyContainer){
        $this->view = new Core_View();
        //$this->view = $dependencyContainer->get(view);


    }
}

1 Ответ

2 голосов
/ 07 сентября 2011

Вероятно, существует множество способов выполнить то, что вы пытаетесь.

"Самый простой" - это просто переопределить конструктор и создать экземпляр модели напрямую.

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

На самом деле я не работал ни с одним фреймворком, который может иметь только одинМодель связана с каждым контроллером (кроме CakePHP? Не помню).С Symfony модели и контроллеры полностью отделены, поэтому вы можете использовать любую модель с любым контроллером.Вы просто создаете модель по мере необходимости.Symfony использует Doctrine ORM, поэтому, например, в действии контроллера, если вам нужна модель, вы должны сделать что-то вроде этого:

$model = Doctrine::getTable('User');

Возможно, стоит подумать о дизайне, более похожем на этот, для продвиженияотделенный дизайн, и я обещаю , что в какой-то момент вам понадобится более одной модели в каком-либо контроллере.

2.) Что касается аутентификации.Что-то, что кажется довольно распространенным, - это иметь какие-то настройки (в конфигурационном файле или в переменной-члене), которые говорят, требует ли текущее действие аутентификации пользователя.Это обрабатывается каждый раз, когда выполняется действие (Yii вызывает фильтры такого рода).Если пользователю необходимо войти в систему, он сохраняет страницу, к которой он пытается получить доступ, а затем перенаправляет его на страницу входа (вам нужно только создать ее).Как только они должным образом аутентифицируются, он перенаправит их туда, куда они первоначально направлялись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...