агрегация по простому возможность сущестования одного класса без второго, например в модель мы можем просто внедрить заглушку (например при тестах) например new Model(new DataBaseMock)
композиция же наоборот не позволяет одному классу работать без другого.
Например, оригинал db.config.php --> db.config.php.example
на самом деле это делается по другому, у проекта создается файл с конфигурацией .env
в котором перечислены все настройки сервера, а также режим работы develpment, production
конфигурация codeigniter использует настройки из этого файла
и .env соответственно не заливается в репозиторий https://github.com/vlucas/phpdotenv
Подключаемся к серверу, определяем папку.
Получаем последние N писем (можно вытаскивать все за раз, можно порциями), с основной информацией кроме содержимого. Проходим по данному массиву с фильтрацией по отправителю, теме и тд.
Для получения детальной информации о письме шлем запрос на получения полной информации о письме с содержанием, вложениями по uid.
формы для админки и публички строятся на основе одного и того же конструктора форм, не хотелось бы разделять реализацию админки и публики так как это может значительно усложнить разработку функционала.
container от thephpleague как и ваш способ работает на рефлексии так что разницы особо нет, единственно что container thephpleague использует такие чтуки как Inflectors, Service Providers которые тоже могут быть полезны. Ну и он идет по дефолту в Laravel
я имею ввиду что если вы пишите например библиотеку которая может на вход принимать объекты разных классов но должны соблюдать определенный контракт:
class Parser{
function __construct(LoggerInterface $logger){}
$parser = new Parser(new MyLogger);
или
$parser = new Parser(new Monolog\Logger("default"));
но в вашем случае вы работает с контроллерами который на вход берут уже конкретные классы
так подождите а какая роль интерфейсов у вас, ведь всегда на вход будет идти один и тот же объект, указанный в @Dependencies . Получается это равносильно __construct(\app\Core\View\BaseView $view,....)
с container auto-wiring
при поиске kl9 MAHLE вы получите позиции:
kl9 MAHLE - 0 уровень кросса (искомый)
42540151A DUCATI - 1
9153580680OE Peugeot - 1
FE1D317 BILSTEIN - 2
соответственно уровень кроссов можно ограничить, не искать больше 2 уровней и тд, а также нет смысла искать товар уже найденный то есть связка FE1D317 BILSTEIN -> kl9 MAHLE проигнорируется так как kl9 MAHLE уже найден
у детали есть уровень кроссирования который можно присваивать искомый 0, кросс 1 уровня, кросс 2 уровня и тд. При поиске можно регулировать насколько глублоко стоит искать, а также уровнем кросса можно регулировать чтобы детали не пересекались
вам не обязательно все блоки подгружать и делать изменяющими через амдинку, можно и в статике, если возникнет необходимость перевести на динамику то переводите и делайте редактируемым блоком.
композиция же наоборот не позволяет одному классу работать без другого.