bermudaphp / skeleton
Bermuda app skeleton. PHP psr micro-framework
Installs: 98
Dependents: 0
Suggesters: 0
Security: 0
Stars: 6
Watchers: 3
Forks: 0
Open Issues: 0
Type:project
Requires
- php: ^8.3
- bermudaphp/app: ^2.0
- bermudaphp/config: ^1.3
- bermudaphp/http: ^1.0.1
- bermudaphp/stringy: ^1.0
- elie29/zend-phpdi-config: ^9.0.1
- laminas/laminas-config-aggregator: ^1.15
- webimpress/safe-writer: ^2.2.0
Requires (Dev)
- laminas/laminas-code: ^4.3
- phpunit/phpunit: ^10.5
- symfony/var-dumper: ^5.1
This package is auto-updated.
Last update: 2024-10-27 16:53:07 UTC
README
composer create-project bermudaphp/skeleton <project-path>
Cкрипт установки предложит выбрать реализацию psr-7 (по умолчанию Nyholm/psr7) и установить шаблонизатор (адаптер для пакета league/plates)
После установки вы получите основанный на psr-15 диспатчере скелет приложения с DI контрейнером, HTTP маршрутизацией и поддержкой командной строки.
Quick start
Зарегистрируйте машруты в файле 'config/routes.php'. Описание интерфейса роутера можно найти здесь.
$routes->addRoute( RouteRecord::get('hello.action', '/hello/{name}', static function(string $name) use ($app): ResponseInterface { return $app->responde(200, 'Hello, ' . $name); }) );
Зарегистрируйте глобальные middleware в файле 'config/pipeline.php'. Реализация диспатчера работает по принципу FIFO
$app->pipe(MyFirstMiddleware::class); $app->pipe(\Bermuda\Router\Middleware\MatchRouteMiddleware::class); $app->pipe(MyThirdMiddleware::class); $app->pipe(\Bermuda\Router\Middleware\DispatchRouteMiddleware::class);
Добавьте зависимости в файл 'config/config.php' и сконфигурируйте DI container
return Config::merge( new Bermuda\App\ConfigProvider, new Bermuda\HTTP\ConfigProvider, new Bermuda\Detector\ConfigProvider, new Bermuda\PSR7ServerFactory\ConfigProvider, new Bermuda\Router\ConfigProvider, new Bermuda\Pipeline\ConfigProvider, new Bermuda\MiddlewareFactory\ConfigProvider, new Bermuda\ErrorHandler\ConfigProvider, new PhpFileProvider('./config/autoload/{{,*.}global,{,*.}local}.php'), new PhpFileProvider('./config/development.config.php'), // App config provider new class extends ConfigProvider { /** * An associative array that maps a service name to a factory class name, or any callable. * Factory classes must be instantiable without arguments, and callable once instantiated (i.e., implement the __invoke() method). * @return array */ protected function getFactories(): array { return [ BootstrapperInterface::class => static function(ContainerInterface $container): Bootstrapper { return Bootstrapper::withDefaults($container)->add(new class implements BootstrapperInterface { public function boot(AppInterface $app): AppInterface { // Бутстрап приложения выполнится после конфигурации контейнера // здесь можно зарегистрировать алиасы для функций экземпляра приложения или установить новые сущности в контейнер // или все, что необходимо cделать до запуска приложения, но после конфигурации контейнера $app->registerCallback('myCallback', static fn() => 'callback'); $app->myCallback() === 'callback' // true $app->set('my-second-dependency', true); $app->extend(MyFirstMiddleware, static function(MyFirstMiddleware $m, AppInterface $app) { return new MyFirstMiddlewareDecorator($m, $app->get('my-second-dependency')); }); $app->get(MyFirstMiddleware::class) instanceof MyFirstMiddlewareDecorator // true } }); }, MyService::class => static fn(ContainerInterface $container) => new MyService($container->get(MyDependency::class)), ]; } }, );
Для запуска консольного приложения необходимо создать команду отнаслдовавшись от класса Console\Commands\Command или реализовать интерфейс Bermuda\App\Console\CommandInterface, после чего зарегистрировать команду в файле 'config/commands.php' Базовая реализация консольного приложения работает поверх пакета symfony/console
class MyCommand extends Command { public function getName(): string { return 'myCommand'; } public function getDescription(): string { return 'MyCommand description'; } protected function execute(InputInterface $input, OutputInterface $output) { // command logics return self::SUCCESS; } } $app->pipe(MyCommands::class);
После чего команда будет доступна по вызову
php bin/console myCommand
или
console myCommand
Если вы используете Windows