LittleFatNinja
@LittleFatNinja
горе девелопер, любитель лютой садомии

Как разобратся с MVC?

Помогите разобратся c MVC
уже несколько дней не могу сдвинутся с места, читал статьи, смотрел схемы

допустим нужно сделать страницу с коментариями
Суть вопроса:
как правильно реализовать модель используя ActiveRecord? (орм понимаю как работает)
должен же быть 1 контролер и одна модель, которая наследуется от AR, НО согласно паттерну AR 1 экземпляр - 1 запись таблицы, а нам нужны все записи, но модель мы создали только одну

Извините за плохую формулировку вопроса
Помогите собрать эту всю кухню в кучу
  • Вопрос задан
  • 1021 просмотр
Решения вопроса 3
@newpy
web-dev
В представлении AR
Model = Таблица
экземпляр Model = запись из таблицы,
что мешает получать записи по одной в цикле из нужной таблицы и записывать в массив. На выходе получается массив или коллекция. Собственно современные ORM это и делают.

Например получение всех записей из таблицы категорий (модель Categories) в большинстве современных фреймворков выглядит примерно так:

$categories = Categories::all()

На выходе в переменной $categories получаем коллекцию (по сути массив каждый элемент которого является объектом модели Categories):

Collection {#168 ▼
  #items: array:5 [▼
    0 => Categories {#169 ▶}
    1 => Categories {#170 ▶}
    2 => Categories {#171 ▶}
    3 => Categories {#172 ▶}
    4 => Categories {#173 ▶}
  ]
}


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

Утрированно:

Controller - управляет.

Если это Посты, то ими надо управлять, действовать. Методы (actions, действия) работы с Постами, например create, delete, update, edit. Логично было бы предположить что для управления Постами нужен PostsController.

Комментарии - свой набор действий (action) логично предположить что для них следовало бы сделать отдельный контроллер CommentsController, который содержал бы логику управления только Комментариями, а не всем на свете(например Пользователями). Вы всегда будете знать что Комментариями управляет CommentsController, Постами - PostsController. Более того, если кто-то другой откроет ваш код, то он сделает логичное предположение, что за Посты у вас отвечает PostsController и начнет работать/ломать оттуда.

Не зацикливайтесь сильно на теории. Пишите код, и чаще выводите var_dump()-ом промежуточные результаты, вы будете видеть как устроено данные, и начнете понимать как к ним подобраться.

Создайте объект класса (Модели), сделайте запрос, выведите дампом и посмотрите как устроены данные. Вы наглядно увидите объект это или массив, или ни то, ни другое, ни третье )).
Ответ написан
Комментировать
1) У вас должна быть таблица, в которой вы храните комментарии.
2) Создайте ОДНУ модель Comment. Она будет относится к таблице Комментарии. Лучше, сгенерируйте модель через gii - будет понятнее. Обратите внимание, что у модели будет метод tableName(). Он показывает, что один класс отностится к одной таблице.
3) Сделайте view, которая показывает все строки таблицы и view, которая показыает конкретную запись таблицы. Итого две вью.
4) Сделайте контроллер, который будет отвечать за ведение комментариев. В контроллере будут экшены, которые будут отвечать за разные действия с комментариями - один для добавления, один для удаления, один для показа всех, один для показа конкретного.
Ответ написан
Комментировать
copist
@copist
Empower people to give
1. создай таблицу в базе (например, book)
CREATE TABLE tbl_post (
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    title VARCHAR(128) NOT NULL,
    content TEXT NOT NULL,
    create_time INTEGER NOT NULL
);


2. с помощью gii создай модель
class Post extends CActiveRecord
{
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }
 
    public function tableName()
    {
        return 'tbl_post';
    }
}

3. Отдельная запись
$post  = Post::model()->findPk(123); // одна статья по идентификатору

4. Много записей
$posts  = Post::model()->findAll(array('order'=>'create_time')); // все статьи в порядке убывания даты публикации


Мануалы с примерами
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@vdl_moskau
Web-developer, Java-developer
Стоит посмотреть на это так:

Есть несколько страниц, страница - модель.

Есть комментарии, связаны со страницей отношением один-ко-многим(has_many в терминах RoR). То есть одна страница - N комментариев.
Ответ написан
gzhegow
@gzhegow
aka "ОбнимиБизнесмена"
Как здесь очень разумно обьяснили:
Сам класс модели - это таблица
Экземпляр класса - это строка таблицы
Это звучит просто ровно до тех пор, пока у тебя не начинается несколько источников данных, в одни из которых ты можешь заливать, а в другие нет - в одних у тебя есть база, а в других это просто файл
Словом смысл в том, что паттерн MVC это как бог. Он вроде бы есть, но его настоящего никто не видел. С помощью него легко обьяснять как это работает, чтобы реализовывать придется запастись йодом и стальными орешками

Я сейчас тоже пытаюсь в этом разобраться и усовершенствовать, чтобы не перейти грань "я люблю паттерны и потому пишу на симфони", а остаться в "я люблю свою работу и потом пишу чтобы работало и курить маны было не нужно", но пока получается так себе
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Искра Екатеринбург
от 80 000 до 100 000 ₽
Art gorka Санкт-Петербург
от 60 000 ₽
от 40 000 до 60 000 ₽
19 апр. 2024, в 03:52
1000 руб./за проект
19 апр. 2024, в 03:01
1000 руб./за проект
18 апр. 2024, в 21:56
2000 руб./за проект