-
-
Notifications
You must be signed in to change notification settings - Fork 1
Feature Class scanning
scan() авто-регистрирует классы из каталога по namespace/regex — не нужно перечислять каждый сервис вручную. Туториал — Class-scanning.
ClassScanner обходит файлы каталога, извлекает объявленные классы (парсинг namespace/class без загрузки), фильтрует по regex/namespace и регистрирует подходящие как autowired. Дальше они разрешаются обычным autowiring.
$c->enableAutowiring();
$c->scan(
directory: __DIR__ . '/src/Handlers',
namespace: 'App\\Handlers',
pattern: '/Handler$/', // только классы, оканчивающиеся на Handler
);
$c->get(App\Handlers\CreateOrderHandler::class); // авто-зарегистрирован- Convention over configuration: новые классы по соглашению попадают в контейнер без правок конфига.
- Regex-фильтр даёт точный контроль над тем, что регистрируется.
- Хорошо для однотипных наборов: хендлеры, команды, подписчики.
- «Неявная» регистрация — по конфигу не видно полного списка сервисов (используйте
dump()для обзора). - Сканирование файлов имеет стоимость на старте (в проде — compiled, где граф уже собран).
- Сканировать узкие, однотипные каталоги (
Handlers,Commands) с точнымpattern. - Комбинировать с тегами: сканируем хендлеры → собираем их в tagged-локатор.
- В проде — компилировать контейнер, чтобы убрать сканирование из рантайма.
- Сканировать весь
src/без фильтра — регистрируется мусор, теряется контроль и растёт старт. - Полагаться на сканирование для сервисов, которым нужна особая сборка (их регистрируйте явно).
Класс с атрибутом #[Exclude] пропускается сканером — не регистрируется и не получает теги/alias'ы/декораторы (аналог Symfony #[Exclude] / exclude:):
use CloudCastle\DI\Attribute\Exclude;
#[Exclude]
final class InternalHelper {} // лежит в каталоге сервисов, но в контейнер не попадётУдобно для базовых/вспомогательных классов рядом с сервисами, которые не должны регистрироваться автоматически.
| Контейнер | Аналог |
|---|---|
| PHP-DI | нет прямого скана каталога ( |
| Symfony |
resource: + exclude: в конфиге (эталон) |
| Laravel | автозагрузка + ручная регистрация в провайдерах ( |
| Pimple | нет (❌) |
| Nette | RobotLoader / search в конфиге |
Symfony, Nette — развитый скан; CloudCastle даёт regex-скан с явным контролем.
См. также: Class-scanning (гайд) · Теги и tagged services.
CloudCastle DI · · PHP 8.1+ · PSR-11
GitHub · Packagist · Releases · Discussions · Сравнение
Исходники Wiki — каталог wiki/ в репозитории (синхронизация через GitHub Actions)
- 🏗️ Архитектура
- ⚡ Быстрый старт
- 📊 Сравнение — 5 аналогов, таблица + победители
- 🧩 Возможности (детально) — каждая фича: принцип, +/−, аналоги
- 🧪 Bootstrap
- 🚀 Compiled container
- 🔗 Contextual binding
- 🤖 Autowiring
- 📄 Конфигурация
- 📖 Справочник конфигурации
- 📂 Сканирование классов
- 🌍 Глобальный реестр
- 🏷️ Теги и декораторы
- 🔗 call(), bind(), hooks
- 🔄 Прототипы, alias, lazy, lazyGhost
- 📋 Справочник API
- 🏭 Фабрики и singleton