Критикуйте мою первую попытку MVC в [закрытом] PHP

1 и 3 являются целыми константами, поэтому Java выполняет целочисленное деление, результатом которого является 0. Если вы хотите написать двойные константы, вы должны написать 1.0 и 3.0.

15
задан Andrew G. Johnson 15 January 2009 в 20:51
поделиться

2 ответа

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

Расположение базы данных (или даже сама база данных) не важно сущности MVC. Это, оказывается, реляционная база данных в большинстве случаев, однако MVC не требует его явно (можно использовать устройство хранения данных XML или некоторую сетку/облако также). То, что крайне важно для MVC, должно сохранить Модель разделенной от остальных, которых Вы сделали.

Ваше Представление также ясно разделяется от остальных. Так же к части M MVC, Представления могут не только представить HTML, но любой представимый текстом вывод (XML, XML+XSL, RSS, простой текст или даже электронные письма), Представления могут быть реализованы несколькими способами: PHP включает как Ваш, шаблоны (т.е. Присяжный острослов) или полностью оперенные объекты, сериализуемые для отправки текстовых сообщений. Я далек от оценки, какая стратегия является лучшей, это - вопрос отдельного стиля кодирования и проектных требований.

Ваш контроллер путает (это - больше Контроллера Страницы, чем Контроллер Приложения). Это, вероятно, происходит из-за того, что существует одна скрытая часть в архитектуре MVC. Это называют Фронтальным контроллером или Диспетчером. Это до Диспетчера, чтобы проанализировать вход, инстанцировать контроллера (как в Контроллере Приложения) и вызвать вызванный метод. Если Вы хотите продолжать идти с Вашей пользовательской реализацией MVC, я предлагаю Вас использующий некоторый распространенный способ передать Класс контроллера и имя метода в URL, т.е.

index.php/Movies/list
index.php/Movies/details/35

Затем в новом index.php Вы просто анализируете $ _SERVER ['PATH_INFO'], инстанцируете класса Movies и назовите list метод, т.е.

$args = explode('/', ltrim($_SERVER['PATH_INFO'], '/'));
$className = array_shift($args);
$method = array_shift($args);
require "$className.php";
call_user_func_array(array(new $className(), $method), $args);

Затем Вы просто перемещаете содержание if-else блок к двум отдельным методам в классе Фильмов.

class Movies { // may extend generic Controller class if you wish

    public function list() {
        $movies = Movie::get_all();
        include 'views/v_list.php';
    }

    public function details($movieId) {
        $movie = new Movie($movieId);
        if ($movie->id > 0) {
            include 'views/v_movie.php';
        } else {
            echo "Movie Not Found";
    }

}

Таким образом, у Вас может быть несколько контроллеров, каждый с несколькими действиями.

Заключительные комментарии.

  • На стороне базы данных было бы удобно использовать одну из существующих платформ ORM. Они сохранят Вас дни работы и будут, вероятно, работать лучше, чем уровень дб ручной работы. Я также предложил бы обработать инстанцирование экземпляра PDO, поскольку инстанцирующий PDO в каждом Объекте модели не самый чистый путь. Что-то как DBFactory::getConnection сделал бы.

  • Можно считать возврат HTML вместо того, чтобы повторить его в контроллере. Это дает Вам гибкость решетки, если бы Вы хотите реализовать Фильтры Прерывания, которые перенесли бы контроллер, прервать его вывод и пред - или выполнить последующую обработку его. Супер удобно иметь фильтр, который присоединяет заголовок HTML и нижний колонтитул автоматически.

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

Всего наилучшего.

28
ответ дан 1 December 2019 в 01:06
поделиться

Вы делаете хорошее, но у меня есть несколько предложений:

  1. , Так как Вы используете php5, не забывают о __ функция автозагрузки.
  2. лучше назвать Ваш уровень данных как Модель.
  3. get_all_from_database не объявляется как статичный, но Вы называете его статически, это генерирует предупреждение уровня E_STRICT. Набор error_reporting (E_ALL | E_STRICT); и необходимо видеть предупреждение.
  4. get_all () статическая функция должна быть в Образцовом классе (в Вашем случае Datatier), так, чтобы Вы не переписывали его для любой модели. Единственное изменение, которое необходимо внести в той функции, состоит в том, чтобы заменить строку:

    $results = родитель:: get_all_from_database ('фильм');

с

$results = $this->get_all_from_database(get_class($this));

это предполагает, что название Ваших моделей должно соответствовать названиям Ваших таблиц в базе данных

10
ответ дан 1 December 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: