Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
 Аватар для LostDok
0 / 0 / 0
Регистрация: 15.06.2014
Сообщений: 49

Реализация CRUD MVC

23.01.2015, 15:06. Показов 3932. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Извиняюсь за глупый вопрос, может не правильно формулирую и вообще не о том думаю, но все же прошу направить в нужное русло.

Пишу сайт на MVC. Все делаю самостоятельно, изобретаю велосипеды для тренировки и понимания паттерна.

Итак, у меня есть страницы. Для каждой страницы есть свои отдельные контроллеры, модели и виды.

Для начала хочу уточнить свое понимание.
Когда пользователь вводит http://site.com/contr/action
Создается контроллер contr, который вызывает событие action. Событие вызывает модель, которая формирует данные. Потом контроллер эти данные передает виду. Сайт отображается.

Вопрос 1. Я правильно понимаю последовательность работы?

Теперь я хочу создать некие типичные страницы. Например, чтобы у меня был контроллер Page, который бы вызывал модель и передавал ей некий Id. Модель бы вытаскивала данные из БД, а потом это бы уходило в вид.
Это я подсмотрел в YII, но не уверен, что вообще все правильно понял. Руководство Yii написано хорошо, но для меня довольно сложно

Так вот я хочу реализовать нечто такое.

То есть, пользователь вводит http://site.com/contr/action/id

Вызывается контроллер contr, который выполняет действие action. Действие вызывает модель и передает ей id. Модель тащит данные из БД, потом все это уходит в виды и сайт отображается. То есть вид для всех один, но данные из БД.

Вопрос 2. Как мне вытащить этот ID и передать в модель?

Для вызова создания контроллеров, моделей, видов у меня есть файл Route.php (на хабре нашел урок и оттуда беру).
Вот он:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
class Route
{
 
    static function start()
    {
        // контроллер и действие по умолчанию
        $controller_name = 'Main';
        $action_name = 'index';
        
        $routes = explode('/', $_SERVER['REQUEST_URI']);
 
        // получаем имя контроллера
        if ( !empty($routes[1]) )
        {   
            $controller_name = $routes[1];
        }
        
        // получаем имя экшена
        if ( !empty($routes[2]) )
        {
            $action_name = $routes[2];
        }
 
        // добавляем префиксы
        $model_name = 'Model_'.$controller_name;
        $controller_name = 'Controller_'.$controller_name;
        $action_name = 'action_'.$action_name;
 
        /*
        echo "Model: $model_name <br>";
        echo "Controller: $controller_name <br>";
        echo "Action: $action_name <br>";
        */
 
        // подцепляем файл с классом модели (файла модели может и не быть)
 
        $model_file = strtolower($model_name).'.php';
        $model_path = "application/models/".$model_file;
        if(file_exists($model_path))
        {
            include "application/models/".$model_file;
        }
 
        // подцепляем файл с классом контроллера
        $controller_file = strtolower($controller_name).'.php';
        $controller_path = "application/controllers/".$controller_file;
        if(file_exists($controller_path))
        {
            include "application/controllers/".$controller_file;
        }
        else
        {
            /*
            правильно было бы кинуть здесь исключение,
            но для упрощения сразу сделаем редирект на страницу 404
            */
            Route::ErrorPage404();
        }
        
        // создаем контроллер
        $controller = new $controller_name;
        $action = $action_name;
        
        if(method_exists($controller, $action))
        {
            // вызываем действие контроллера
            $controller->$action();
        }
        else
        {
            // здесь также разумнее было бы кинуть исключение
            Route::ErrorPage404();
        }
    
    }
 
    function ErrorPage404()
    {
        /*$host = 'http://'.$_SERVER['HTTP_HOST'].'/';
        header('HTTP/1.1 404 Not Found');
        header("Status: 404 Not Found");*/
        header('Location: /404');
        
    }
    
}
Мне надо что-то менять в этом файле, чтобы вытаскивать ID и создавать его для контроллера. Правильно понимаю?

Заранее спасибо за ответы)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.01.2015, 15:06
Ответы с готовыми решениями:

Реализация autoload на mvc
Подскажите как мне избавится от include в моем маршрутизаторе, и реализовать функцию autoload для автоматической загрузки классов. Вот мой...

MVC- грамотная реализация модели
Здравствуйте! Осваиваю ООП+MVC, брал пример из http://habrahabr.ru/post/150267/ Хочу научиться вести порядок у себя в классах, по всем...

Грамотная реализация MVC ООП
Доброе утро всем, уже вторые сутки лазию в просторах интернета и не могу найти нормальную реализацию MVC ООП, без ООП нашел, но все жи...

9
Нет ТЗ - давай досвидания
 Аватар для BuPy7
746 / 377 / 64
Регистрация: 01.12.2011
Сообщений: 2,250
Записей в блоге: 6
23.01.2015, 15:27
парсер роутов нужно написать и делов) либо забей и делай
Code
1
http://site.com/contr/action?id=3
1
 Аватар для LostDok
0 / 0 / 0
Регистрация: 15.06.2014
Сообщений: 49
23.01.2015, 17:24  [ТС]
То есть надо сделать что-то такое:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
static function start()
    {
        // контроллер и действие по умолчанию
        $controller_name = 'Main';
        $action_name = 'index';
                $id = 0;
        
        $routes = explode('/', $_SERVER['REQUEST_URI']);
 
        // получаем имя контроллера
        if ( !empty($routes[1]) )
        {   
            $controller_name = $routes[1];
        }
        
        // получаем имя экшена
        if ( !empty($routes[2]) )
        {
            $action_name = $routes[2];
        }
        
              // получаем ID
        if ( !empty($routes[3]) )
        {
            $id = $routes[3];
        }

Я объявил новую переменную id. И взял ее значение из $routes[3]
0
Нет ТЗ - давай досвидания
 Аватар для BuPy7
746 / 377 / 64
Регистрация: 01.12.2011
Сообщений: 2,250
Записей в блоге: 6
23.01.2015, 17:38
Это неправильно. Я говорил про парсер. Парсер должен уметь "размышлять" о том, что ему передали. Необязательно у тебя ID будет первым в списке после controller и action. Тебе нужно либо написать парсер, который будет вытаскивать все переменные, а так же который будет разбираться, что ему передали, либо забить и оставить как есть и пользоваться дефолтным $_POST и $_GET.
1
 Аватар для LostDok
0 / 0 / 0
Регистрация: 15.06.2014
Сообщений: 49
23.01.2015, 17:47  [ТС]
Я сделал только что так. Вроде получил то, что хотел, но не знаю насколько правильная такая реализация.

Я создал в route переменную ID. Вытаскиваю ее из адреса типа (http://site.com/page/index/5 - тут id = 5).
После этого при создании контроллера я передаю этот ID ему так:

PHP
1
$controller = new $controller_name($id ? $id : 0);
В Controller_Page у меня объявлено новое поле класса Controller_Page так:

PHP
1
public $id;
Конструктор класса этого принимает ID и присваивает его ID класса так:

PHP
1
2
3
4
5
6
function __construct($id)
    {
        $this->model = new Model_Page();
        $this->view = new View();
        $this->id = $id;
    }
В экшене index я передаю ID модели так:

PHP
1
$data = $this->model->get_data($this->id);
Модуль уже работает с базой на основе ID. После чего просто генерирую вид так:

PHP
1
$this->view->generate('page_view.php', 'template_view.php', $data);
Насколько это вообще правильно и логично?
0
Нет ТЗ - давай досвидания
 Аватар для BuPy7
746 / 377 / 64
Регистрация: 01.12.2011
Сообщений: 2,250
Записей в блоге: 6
23.01.2015, 18:20
Вообще неправильно и нелогично. Ты жёстко завязал всю логику работы. А если мне не нужен ID, то что тогда?

Всё же просто и очевидно. Ты делаешь парсер, который разбивает строку из переменной, к примеру, route. Роутер должен соответствовать шаблону
Code
1
[/module][/controller]/action[/param1/value1][/param2/value2]...[/paramN/valueN]
. В пасере маршрута ты смотришь, что и где и как у тебя. Сначала проверяешь что это за шаблон передан: вызов экшена из модуля, контролера или текущего пути, а так же на наличие аргументов в методе. Эти аргументы должны быть уазаны в методе класса контроллера, например,
PHP
1
public function actionIndex($id)
После успешного парсинга и если такой экшн существует - передаешь управление ему, перед этим проверяя, есть ли аргументы в этом экшене, если да, то передаешь управление вместе с переменными которые быле переданы в маршруте, если есть, если нет, а в экшене они требуются - выкидываешь исключение. Чтобы такого не было, т.е. если передача переменной не обязательна, указываешь дефолтное значение аргументу в методе. Всё.

А так жестко привязывать, как сделал это ты - не нужно, это в корне неверно.
0
 Аватар для LostDok
0 / 0 / 0
Регистрация: 15.06.2014
Сообщений: 49
23.01.2015, 19:43  [ТС]
В роутере вынул данные... Вот так:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$params = array();
        
        $routes = explode('/', $_SERVER['REQUEST_URI']);
 
        // получаем имя контроллера
        if ( !empty($routes[1]) )
        {   
            $controller_name = $routes[1];
        }
        
        // получаем имя экшена
        if ( !empty($routes[2]) )
        {
            $action_name = $routes[2];
        }
        
        //Получаем параметры
        for($i = 3; $i < count($routes); $i++)
            $params[$i-3] = $routes[$i];
Потом создаю контроллер и передаю ему параметры.

PHP
1
2
3
4
5
6
7
8
9
// создаем контроллер
        $controller = new $controller_name($params);
        $action = $action_name;
        
        if(method_exists($controller, $action))
        {
            // вызываем действие контроллера
            $controller->$action();
        }
Конструктор контроллера принимает их и (не знаю что я тут вообще делаю ) cоздает ID.

PHP
1
2
3
4
5
6
function __construct($params)
    {
        $this->model = new Model_Page();
        $this->view = new View();
        $this->id = $params[0];
    }
Ну и потом уже index отрабатывает..

PHP
1
2
3
4
5
function action_index()
    {
        $data = $this->model->get_data($this->id);      
        $this->view->generate('page_view.php', 'template_view.php', $data);
    }
Прошу тыкнуть меня носом в участок кода где и как я должен передать параметры экшену. И где я должен проверить есть ли аргументы в экшене, в роуте? И как проверить?
0
Нет ТЗ - давай досвидания
 Аватар для BuPy7
746 / 377 / 64
Регистрация: 01.12.2011
Сообщений: 2,250
Записей в блоге: 6
23.01.2015, 19:55
Здесь всё неверно. Я же описал логику работы. Делай. =)

Ну хотя, если ты хочешь передавать только один вид маршрута, то первый кусок кода пойдет до 16 строки. =)
0
 Аватар для LostDok
0 / 0 / 0
Регистрация: 15.06.2014
Сообщений: 49
23.01.2015, 20:05  [ТС]
Где можно почитать о маршрутизации в MVC? Только желательно чтобы с примерами.
0
Нет ТЗ - давай досвидания
 Аватар для BuPy7
746 / 377 / 64
Регистрация: 01.12.2011
Сообщений: 2,250
Записей в блоге: 6
23.01.2015, 20:08
LostDok, не знаю даже =) Посмотри простые фреймворки типа Slim или CodeIgniter.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.01.2015, 20:08
Помогаю со студенческими работами здесь

MVC. Изменения в таблицах. реализация метода set
Здравствуйте уважаемые программисты. Прошу у Вас помощи. Задача: реализовать метод set, который будет изменять имя и все это с помощью...

MVC: CRUD подобное API для моделей – best practices?
Доброго времени суток! Долго думал куда постить – в &quot;PHP и ООП&quot; или &quot;Для начинающих&quot; ибо вопрос может быть очень простым и...

Реализация CRUD операций с большим количеством таблиц - лучшая практика?
Уважаемые Гуру! Задача - сделать менеджер таблиц (выполнение CRUD операций). Таблиц довольно много. Есть ли какие-нибудь библиотеки,...

Ссылки в CRUD-таблице на другие CRUD-таблицы
Здравствуйте! Прошу у вас помощи :help: У меня есть список групп: Так выглядит представление таблицы `groupp` в PhpMyAdmin: ...

Реализация паттерна MVC
Доброго времени суток. Допустим у меня есть класс Database в котором 2 метода: class Database { public OleDbConnection...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru