Ответы пользователя по тегу Паттерны проектирования
  • Как организовать взаимодействие админ. панели и остальных модулей?

    @romeo7
    Структура Вашего приложения:
    58d11ec2ff8247e28f9e7f65f9ca95fb.png
    В index.php (условный bootstrap Вашего приложения) осуществляем роутинг.
    pastebin.com/gcFPbtP8
    Если в роутинге реализованы группы (в ZF это child_routes), то /admin/ можно вынести в отдельную группу:
    pastebin.com/PBL6bTHt
    В папке models хранятся модели. Модель Velo возвращает данные, к примеру, из БД.
    Actions находящиеся в контроллере VeloController делегируют данные во вьюху (actionIndex) или, как в случаи, actionCreate, actionUpdate и actionDelete - осуществляется необходимые действия и производят редирект.
    pastebin.com/kMNCHV4f
    Прошу заметить, что контроллер бэкенда (админки) наследуется от контроллера фронтенда:
    class VeloController extends \apps\frontend\controllers\VeloController

    Вполне возможно, что, к примеру, добавление Velo доступно не только администрации сайта, но и обычному смертному. С Velo не очень удачный пример, лучше Comments. Аналогично и с моделями.
    Только помните, что использование жирных, уродливых actions не является хорошей практикой. Фильтрацию (санитизацию) и валидацию данных request можно осуществить в модели. Пример с rules, если помните.

    P.S. Заметил, что у Вас множество вопросов в toster связано с ZF2. Сложности возникают потому, что у ZF чуть более высокий порог входа. Для начала лучшим выбором мог быть любой микрофреймворк (Laravel, CodeIgniter,...)

    UPDATE

    > А почему у вас фигурирует 2 модели?
    Логично предположить, что запрос к БД на возврат списка велосипедом может фигурировать, как в админке, так и для вывода, к примеру, на главной странице. Удаление, добавление, обновление записи может быть доступно только через админку. Потому:
    namespace apps\frontend\models;
    
    class Velo extends ActiveRecord
    {
       public static function tableName()
       {
           return 'tbl_velo';
       }
       public function getAll($limit)
       {
          return static::find()->limit($limit)->asArray()->all();
       }
    }

    Модель для админки:

    namespace apps\backend\models;
    
    class Velo extends \apps\frontend\models\Velo
    {
       public static function create($content)
       {
            $velo = new static;
            $velo->content = $content;
            return $velo->save();
       }
    
       public static function update($id, $content)
       {
           $conditions = ['id' => $id];
           return static::updateAll(['content' => $content], $conditions);
       }
    
       public static function delete($id)
       {
           return static::deleteAll(['id' => $id]);
       }
    }


    Я зря написал запросы на добавление/обновление/удаление/ в контроллере.
    Данная модель характерна для Yii2, которая строится на ORM ActiveRecord (паттерн).
    В Doctrine используется немного иной паттерн - Data mapper.
    Для каждой модели есть свой контроллер, ибо на главной и админке список может выглядеть иначе - разные вьюхи. А, к примеру, для ajax-а (помимо frontend, backend, добавится директория ajax. Для условности назовём всё это scopes) данные будут возвращаться в JSON, т.е. без вьюхи.
    Контроллер Velo для frontend:
    pastebin.com/diXPu5yY
    Контроллер Velo для backend:
    pastebin.com/3s7EpJAD
    Вот и вся MVC ;)
    Ответ написан
    8 комментариев