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

Привет

Пишу велосипед — в данный момент занимаюсь админкой. Ситуация:
В данный момент у меня вся логика, связанная с управлением моим велосипедом (добавление запчастей, замена запчастей, удаление запчастей) находится в контроллере велосипеда, вью находятся там же — в папке с модулем. В модуле админки пути были переопределены так, что к управлению велосипедом я имею доступ только по ссылке /admin/veloВ роутинге пути модуля велосипеда сделаны child route пути admin. В итоге во view файлах, которые лежат в модуле Velo, я использую пути, которые сгенерированы модулем Admin: admin/velo Это совершенно не круто, возникает зависимость модуля Velo от модуля Admin.

Возникает мысль (!), что нужно сделать так: в модуле будут только те действия (action), которые нужны для отображения велосипеда пользователю, а в админке будет еще один контроллер (в другом неймспейсе), который будет отвечать за управление велосипедом. В админке же будут view, в которых будут использованы пути admin/veloВ самом модуле будут view, в которых будут использован путь velo. Таким образом, зависимости модуля Velo от модуля Admin не будет. Но! Но модуль Velo будет неполный, ибо не будет управления модулем (как, например, модуль Album из zf2-skeleton).

Итог:
— в первом случае появляется ненужная зависимость модуля Velo от модуля Admin;
— во втором случае модуль Velo будет неполный, так как в нем не будет управления велосипедом.

Вопрос: какой компромисс найти?

Я в этом деле новичок, наверняка чего-либо не знаю.
  • Вопрос задан
  • 3657 просмотров
Решения вопроса 1
@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 ;)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы