Чтобы упорядочить код приложения мы прибегаем к ряду мер. В том числе используем пространства имен и распределяем файлы по директориям. Про пространства имен вроде бы понятно. Вопрос что есть для Laravel для второго пункта.
В Laravel имеется такое решение как пакеты. Штатная штука и ее вроде бы можно использовать для модульности. Но для каждого пакета нужно будет очень много настроек прописывать вручную. Весь код лежать в packages/имя пакета/src … и выглядеть как нечто стороннее. Метод рабочий, но он, скорее, для подготовки пакетов, которые будут использоваться в других проектах.
Далее рассмотрим сторонние решения, которые делают модули в отдельной папочке Modules.
Что можно найти:
- nWidart/laravel-modules (20 контрибьютеров; последний commit вчера; 700 с лишним звезд на github)
- mrabbani/laravel_module_manager (2 контрибьютера; последний commit в апреле 2017; 60 звезд)
- mnabialek/laravel-modular (1 контрибьютер; последний commit 11 месяцев назад; 16 звезд)
- caffeinated/modules
(26 контрибьютеров; последний commit в мае; 500 с лишним звезд)
Из статистики проектов видно, что лидерами являются nWidart/laravel-modules и caffeinated/modules. Хотя первый из них все же обновляется чаще.
Я немного рассмотрел их вблизи и попробовал создать с помощью каждого пару модулей с контроллерами в каждом. Получилось два микро проекта: проект для nWidart/laravel-modules и проект для caffeinated/modules.
Оба пакета выполняют свои функции. Умеют генерировать модули с помощью команд artisan. Правда, nWidart/laravel-modules, как можно было ожидать, все же немного более удобен. Например, в нем был генератор, который сразу создавал и маршрут, контроллер-пример и представления. А в caffeinated/modules приходилось многое делать вручную или генерировать частями. Документация у первого куда как лучше.
Можно добавить еще, что nWidart/laravel-modules – это переделанная, переосмысленная и поддерживаемая версия пакета pingpong/modules. Так же данный пакет используется в AsgardCMS и имеет тесты.
Другими словами победитель очевиден.
Полезные ссылки: