вам нужно именно в корне для css,js,images ? как вариант перекидывать файлы из vendor пакета в публичную директорию сайта, либо ручками либо скриптом https://getcomposer.org/doc/articles/scripts.md
На счет DDD, UserService - Service - Сервис. Содержат бизнес логику приложения. Все зависимости поступают из вне. Зависят от абстракций. Разве не оно?
По поводу доктрины, очень она громозкая, так как я разрабатываю отдельный компонент для системы которая доктрину не использует то тянуть доктрину для ради одного опционального пакета не очень гуд. Если есть менее объемная библиотека для реализации datamapper то можно было рассмотреть использование.
вот смотрите $User->id = 1; $User->name = 'vova'; $User->update(); метод update содержит некую логику позволяющую подготовить данные для обновления в базе данных, в итоге будет задействован некий qeurybuilder который сформирует запрос к базе (в зависимости от подключенного драйвера mysql, postgre и тд), выполнит его и отдаст результат успешно или нет. Так вот если есть возможность то qeurybuilder нужно подменить и тестировать нужно изолированно только метод update. Так как qeurybuilder идет вместе с фрамеворком и протестирован разработчиками. Если у вас используется dependency injection то такие зависимости легко глушатся при тестах. Repository - посредник между сущностями и хранилищем и как раз содержит CRUD, подмена хранилища при тестах позволяет протестировать репозитории без подключения к базе.
префикс добавляют для группировки таблиц по конкретному функционалу это облегчает работу с ними когда таблиц очень много. Префикс у полей полезен для уникальности названия полей при выполнении запросов, нет необходимости присваивать псевдонимы.
на самом деле клиентам ваш код не нужен, им нужен результат работы, даже если у вас будет идеальная архитектура, SOILD, тесты и т.д. это никто не оценит, клиенту пофиг что под капотом.
не разбирался с работой компонентов в Yii но интересно как там assets файлы используются ведь не будет приложение напрямую из каталога vendor их подключать?
обычно схема такая:
1. Для каждого проекта есть git репо, добавляется post hook на Jenkins сервер
2. На сервере под управлением Jenkins создаются проекты, каждый проект делает: 1)обновляется через гит, 2)обновляет зависимости, 3)тестирует проект, 4)заливает на удаленный сервер
3. При коммите в мастер ветку или слиянии с мастер веткой разработчиком, уходит запрос на jenkins и тот делает свою работу. Для вашего случая 1 и 4 обязательные
Вместо jenkins можно использовать любой облачный CI сервис, я использую codeship
для этого и нужен Continuous Integration сервер который а) подтянет через гит проект б) обновит компосер в) протестирует проект г) зальет файлы на рабочий сервак
я почему то думал что data mapper использует репозиторий
$user = new User;
$user->setName('test');
$userMapper = new UserMapper( new InMemoryUserRepository )
$userMapper->save($user);
так и делаю, но зависимости пакета не грузятся, видимо при подключении пакета из репозитория "repositories" зависимости не могут быть получены или я ошибаюсь https://getcomposer.org/doc/faqs/why-can't-composer-load-repositories-recursively.md