Это как использовать шаблон MVC в PHP OO - PullRequest
5 голосов
/ 04 февраля 2011

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

Некоторые из основных целей,
- Используйте PHP Object Oriented вместо процедурных.
- Используйте MVC или что-то подобное, чтобы узнать больше об этом стиле.
- Быть легким и быстрым /хорошая производительность

Вот моя запланированная структура сайта, за исключением некоторых других папок для javascript, изображений, css, некоторых вспомогательных функций / файлов и т. д.

///////////// Структура сайта /////////////

site.com/
        /index.php
site.com/library/
                /Config.class.php
                /Photos.class.php
                /Mail.class.php
                /Filter.class.php
                /QRcodes.class.php
                /Router.class.php
                /Database.class.php
                /Templates.class.php
                /etc, etc,etc......
site.com/modules/
                /account/
                        /model
                        /views
                        /controllers
                /users/
                        /model
                        /views
                        /controllers
                /messages/
                        /model
                        /views
                        /controllers
                /API/
                        /model
                        /views
                        /controllers
                /forums/
                        /model
                        /views
                        /controllers
                /blogs/
                        /model
                        /views
                        /controllers
               /etc, etc, etc, etc.............
                        /model
                        /views
                        /controllers

Я решил направить весь запрос через одну точкуof index.php
Я создам класс / объект Router, который будет сопоставлять URI с картой возможных пунктов назначения с использованием регулярных выражений.Вот фрагмент того, что у меня есть сейчас для этой части ...

<?php
//get url from URL
$uri = isset($_GET['uri']) ? $_GET['uri'] : null;

$uri_route_map = array( 
    //users/account like http://mysite.com/users/324 (any digit)
    'users/friends/page-(?<page_number>\d+)' => 'modules/users/friends/page-$1',
    'users/friends/edit/page-(?<page_number>\d+)' => 'modules/users/friends/edit/page-$1',
    'users/friends/edit' => 'modules/users/friends/edit',
    'users/friends/' => 'modules/users/friends/',
    'users/online' => 'modules/users/online/' ,
    'users/online/page-(?<page_number>\d+)' => 'modules/users/online/page-$1',
    'users/create' => 'modules/users/create',
    'users/settings' => 'modules/users/settings',
    'users/logout(?<page_number>\d+)' => 'modules/users/logout',
    'users/login' => 'modules/users/login',
    'users/home' => 'modules/users/home',

    //forums
    'forums/' => 'modules/forums/index',
    'forums/viewthread/(?<id_number>\d+)' => 'modules/forums/viewthread/$1',
    'forums/viewforum/(?<id_number>\d+)' => 'modules/forums/viewforum/$1',
    'forums/viewthread/(?<id_number>\d+)/page-(?<page_number>\d+)' => 'modules/forums/viewthread/$1/page-$2',
    'forums/viewforum/(?<id_number>\d+)/page-(?<page_number>\d+)' => 'modules/forums/viewforum/$1/page-$2',

    // TESTING new method to define class and page better!
    'users/home' => array('PAGE CLASS NAME', 'ACTION NAME')

    //blog routes coming soon
    //mail message routes coming soon
    //various other routes coming soon
);

//////////////////////////////////
class Router
{
    public function __construct()
    {
    }

    public function get_route($uri, array $uri_routes)
    {
        foreach ($uri_routes as $rUri => $rRoute) {
            if (preg_match("#^{$rUri}$#Ui", $uri, $uri_digits)) {
                //if page number and ID number in uri then set it locally
                $page_number = (isset($uri_digits['page_number']) ? $uri_digits['page_number'] : null);
                $id_number = (isset($uri_digits['id_number']) ? $uri_digits['id_number'] : null);
                echo '<hr> $page_number = ' . $page_number . '<BR><hr> $id_number = ' . $id_number;
                $uri = preg_replace("#^{$rUri}$#Ui", $rRoute, $uri);
                echo '<BR><BR>Match found: ' . $uri_routes . '<BR><BR>';
                break;
            }
        }
        $uri = explode('/', $uri);
    }
}

$uri = new Router();
$uri = $uri->get_routes($_GET['uri'], $uri_route_map);

?>



ОБРАТИТЕ ВНИМАНИЕ

КОД ВЫШЕ ВСЕ ВСЕ ТЕСТ-КОД И БУДЕТ ИЗМЕНЕН, ЭТО ТОЛЬКО КОНЦЕПЦИЯ

Итак, как вы можете видеть, я планирую получить index.php для получения URI, проверить его на предмет допустимых путейесли он найден, он включает или создает раздел заголовка, затем создает раздел содержимого и, наконец, нижний колонтитул страницы.

Если бы вы получили доступ, например ... www.test.com / blogs / userid-32423 / page-23

Страница будет ...

  • build header ()
  • создавать объектные блоги ... $ blogs = новые блоги;
  • вызывать $ blogs-> viewbyID ($ userID, $ paging);// $ userID будет 32423, а $ paging будет 23 из URI
  • нижнего колонтитула сборки

Теперь основано на моей структуре папок.Я полагаю, что файл класса блогов в нашем приведенном выше примере будет считаться CONTROLLER .Если я до сих пор прав, то этот класс блогов, который вызывает blogs-> viewbyID (ID, PAGE), метод viewbyID, будет устанавливать некоторый код, запрашивать базу данных и настраивать некоторые переменные для страницы, а затем включать блоги.файл шаблона.Этот файл шаблона блога можно считать VIEWS .

Теперь у меня может быть неверная концепция, и поэтому я опубликовал так много кода и текста, чтобы попытаться объяснить свой взгляд на него, пожалуйста, дайте мне мысли, предложения, скажите, где я совершенно неправ, итам, где я могу быть на правильном пути, я буду очень признателен за любую конструктивную критику или мысли.Если я прав в своем вышеупомянутом использовании части View, Controller шаблона MVC, то какая часть моего кода будет считаться модальной?Это почему-то несколько смущает меня.

Бонусный вопрос ... А как насчет формы сообщения, где я должен обрабатывать их?В моем примере я сконцентрировался на модуле блога, поэтому давайте скажем POST для добавления новой записи в блоге и POST для редактирования записи в блоге, где они должны обрабатываться (модальные, просмотр, контроллер))

Ответы [ 2 ]

5 голосов
/ 04 февраля 2011

Работа контроллера заключается в том, чтобы изучить ввод пользователя и определить, что запрашивается. После того, как это определено, вызывается модель (и).Затем контроллер берет полезную нагрузку модели и передает ее на просмотр.

По сути, модель представляет собой модель предприятия. Хотите добавить запись в блоге?Тогда модель блога будет иметь метод ->add или ->save (который вызывается контроллером. Контроллер блога также может иметь метод add, но он не предназначен для общения с базой данных. Он предназначен для проверки вводаи затем вызывая модель, чтобы сделать фактическую экономию).Методы модели не всегда взаимодействуют с базой данных, но обычно это делают.

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

Просто помните, что контроллер является точкой входа для всех ваших клиентов. Каждый URL, который обрабатывает ваше приложение, должен соответствовать методу контроллера.Затем контроллер сообщает модели, что делать, передавая пользовательский ввод.

3 голосов
/ 04 февраля 2011

Ваши модели должны запрашивать базу данных, а не ваш контроллер. Ваша модель предназначена для обработки всех CRUD действий и, при необходимости, передачи результатов обратно в контроллер для передачи в представление. Обычный поток будет

Controller > Model > Controller > View
...