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

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

23.01.2015, 15:06. Показов 3913. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru