Реализация MVP в веб-приложениях - PullRequest
2 голосов
/ 31 декабря 2011

Насколько я понимаю, MVP является производной от MVC, где Модель и Представление свободно или полностью отделены, а Presenter заменяет Контроллер и действует как мост между Представлением и Моделью. Этот шаблон кажется более подходящим, чем традиционный MVC в веб-приложениях (независимо от того, является ли это истиной, не является предметом этого вопроса, поэтому, пожалуйста, воздержитесь от перехода в этом направлении) .

Моя проблема заключается в реализации различных частей MVP в PHP с использованием пассивного представления. Вот мой текущий поток вещей:

  1. PHP-скрипт устанавливает автозагрузчик и маршрутизатор. Для меня это означает, что любое существующее представление отправляет какое-либо событие на сервер.
  2. Затем маршрутизатор определяет, какой презентатор должен использоваться на основе запроса.
  3. Здесь будут драконы. Presenter действует как мост между представлением и моделью и должен принимать представление и модель в качестве зависимостей, чтобы их можно было легко проверить. Это означает, что мне нужно знать, какую модель и вид я должен использовать до создания докладчика.

Кажется, что докладчик - это тот класс, который знает, какая модель и какое представление ему нужны, так как я могу убрать эту логику из презентатора? Я понимаю, что общий шаблон для использования - это фабрика, я просто не могу понять, как реализовать его в этом случае.

Возможно, я все делаю неправильно. Возможно, я слишком долго занимался кодированием и испытываю перекос ума. Независимо от того, почему я не могу понять, как решить эту проблему, я приму любое руководство.

Ответы [ 2 ]

0 голосов
/ 31 декабря 2011

Я считаю полезным рассматривать веб-приложения с точки зрения состояний и переходов между состояниями.приложение находится в определенном состоянии, оно «в» виде, некоторый HTML был с помощью связанного Presenter из данных в модели и отображен в браузере.Пользователь выполняет действие, и это собирается переместить наше приложение в новое состояние.Итак, мы переходим от одной пары View / Presenter к другой.По моему мнению, модель - это более продолжительная, развивающаяся вещь, и я не вижу, чтобы мы получали новую модель для каждого перехода.

Итак, у вас есть PresenterA, отвечающий за реагирование на события в ViewA.

PresenterA получает какое-то событие, выполняет некоторую работу, которая может привести к изменениям модели, а затем решает, к какому представлению перейти, например ViewB.ViewB может создать своего Presenter.В соответствии с примером из Википедии (не PHP, я понимаю, но принцип ясен):

 public class DomainView: IDomainView
 {
     private IDomainPresenter domainPresenter;

     public DomainView()   // Constructor
     {
        this.domainPresenter = new ConcreteDomainPresenter(this);
     }
 }

По сути, Presenter является создателем следующей пары View / Presenter.Если у вас более сложная логика, замените явный конструктор

 new ConcreteDomainPresenter(this);

фабрикой, работающей с информацией о представлении и модели.

0 голосов
/ 31 декабря 2011

Не уверен на 100%, что я знаю, о чем вы спрашиваете. Вы правы, что загружаете соответствующий контроллер на основании запроса. Этот контроллер обычно связан с моделью и представлением.

Допустим, у вас есть URL, который выглядит следующим образом: http://www.example.com/test/view/1

Было бы довольно стандартно загрузить тестовый контроллер, вызвать метод view передать ему аргумент 1. Итак, давайте предположим, что у вас есть:

  • TestController.php
  • TestModel.php
  • test.php (просмотр)

Когда TestController загружает, он включает модель TestModel, куда направляются ваши «данные» (думаю, вы это понимаете). Итак, для этого примера, скажем, view хочет загрузить последние 5 сообщений от пользователя с идентификатором 1. Так в TestController.php:

function view($arg)
{
    $userID = $arg;
    $posts = $this->model->loadPosts($userID);
    $this->render('test', $posts); // outputs the HTML in test.php
}

А в test.php вы можете перебирать $posts и выводить его по своему выбору.

Похоже, вы уже знаете, как все это работает, поэтому я запутался в том, что вы спрашиваете. Это что-нибудь проясняет?

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