Структура Вашего приложения:
В 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 ;)