Как загрузить модель в контроллер в 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);


    }
}
Author: JasonDavis, 2011-09-07

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 вызывает фильтры такого рода). Если пользователю необходимо войти в систему, он сохраняет страницу, к которой он пытается получить доступ, а затем перенаправляет их на страницу входа в систему (вам нужно только создать ее). Как только они должным образом пройдут аутентификацию, он перенаправит их обратно туда, куда они направлялись изначально.

 2
Author: gregghz, 2011-09-07 02:52:24