snicco / kernel
snicco 框架的核心
Requires
- php: ^7.4|^8.0
- psr/container: ^1.1
- snicco/str-arr: ^2.0
- webimpress/safe-writer: ^2.2
- webmozart/assert: ^1.10
Requires (Dev)
- phpunit/phpunit: ^9.5.13
- snicco/pimple-bridge: ^2.0
Conflicts
- snicco/better-wp-api: <2.0.0-beta.9
- snicco/better-wp-cache: <2.0.0-beta.9
- snicco/better-wp-cache-bundle: <2.0.0-beta.9
- snicco/better-wp-cli: <2.0.0-beta.9
- snicco/better-wp-cli-testing: <2.0.0-beta.9
- snicco/better-wp-hooks: <2.0.0-beta.9
- snicco/better-wp-hooks-bundle: <2.0.0-beta.9
- snicco/better-wp-mail: <2.0.0-beta.9
- snicco/better-wp-mail-bundle: <2.0.0-beta.9
- snicco/better-wp-mail-testing: <2.0.0-beta.9
- snicco/better-wpdb: <2.0.0-beta.9
- snicco/better-wpdb-bundle: <2.0.0-beta.9
- snicco/blade-bridge: <2.0.0-beta.9
- snicco/blade-bundle: <2.0.0-beta.9
- snicco/content-negotiation-middleware: <2.0.0-beta.9
- snicco/debug-bundle: <2.0.0-beta.9
- snicco/default-headers-middleware: <2.0.0-beta.9
- snicco/eloquent: <2.0.0-beta.9
- snicco/encryption-bundle: <2.0.0-beta.9
- snicco/event-dispatcher: <2.0.0-beta.9
- snicco/event-dispatcher-testing: <2.0.0-beta.9
- snicco/guests-only-middleware: <1.0.0
- snicco/http-routing: <2.0.0-beta.9
- snicco/http-routing-bundle: <2.0.0-beta.9
- snicco/http-routing-testing: <2.0.0-beta.9
- snicco/https-only-middleware: <2.0.0-beta.9
- snicco/illuminate-container-bridge: <2.0.0-beta.9
- snicco/kernel-testing: <2.0.0-beta.9
- snicco/method-override-middleware: <2.0.0-beta.9
- snicco/minimal-logger: <2.0.0-beta.9
- snicco/must-match-route-middleware: <2.0.0-beta.9
- snicco/no-robots-middleware: <2.0.0-beta.9
- snicco/open-redirect-protection-middleware: <2.0.0-beta.9
- snicco/payload-middleware: <2.0.0-beta.9
- snicco/pimple-bridge: <2.0.0-beta.9
- snicco/psr7-error-handler: <2.0.0-beta.9
- snicco/redirect-middleware: <2.0.0-beta.9
- snicco/session: <2.0.0-beta.9
- snicco/session-bundle: <2.0.0-beta.9
- snicco/session-psr16-bridge: <2.0.0-beta.9
- snicco/session-testing: <2.0.0-beta.9
- snicco/session-wp-bridge: <2.0.0-beta.9
- snicco/share-cookies-middleware: <2.0.0-beta.9
- snicco/signed-url: <2.0.0-beta.9
- snicco/signed-url-psr15-bridge: <2.0.0-beta.9
- snicco/signed-url-psr16-bridge: <2.0.0-beta.9
- snicco/signed-url-testing: <2.0.0-beta.9
- snicco/signed-url-wp-bridge: <2.0.0-beta.9
- snicco/templating: <2.0.0-beta.9
- snicco/templating-bundle: <2.0.0-beta.9
- snicco/testable-clock: <2.0.0-beta.9
- snicco/testing-bundle: <2.0.0-beta.9
- snicco/trailing-slash-middleware: <2.0.0-beta.9
- snicco/wp-auth-only-middleware: <2.0.0-beta.9
- snicco/wp-capability-middleware: <2.0.0-beta.9
- snicco/wp-capapility-middleware: <1.0.0
- snicco/wp-guests-only-middleware: <2.0.0-beta.9
- snicco/wp-nonce-middleware: <2.0.0-beta.9
- dev-master
- v2.0.0-beta.9
- v2.0.0-beta.8
- v2.0.0-beta.7
- v2.0.0-beta.6
- v2.0.0-beta.5
- v2.0.0-beta.4
- v2.0.0-beta.3
- v2.0.0-beta.2
- v2.0.0-beta.1
- v1.10.1
- v1.10.0
- v1.9.1
- v1.9.0
- v1.8.1
- v1.8.0
- v1.7.0
- v1.6.2
- v1.6.1
- v1.6.0
- v1.5.0
- v1.4.2
- v1.4.1
- v1.4.0
- v1.3.0
- v1.2.1
- v1.2.0
- v1.1.3
- v1.1.2
- v1.1.1
- v1.1.0
- v1.0.2
- v1.0.1
- v1.0.0
- dev-beta
This package is auto-updated.
Last update: 2024-09-07 14:27:58 UTC
README
Kernel 组件是 Snicco 项目 的核心,它帮助启动使用插件架构的应用程序。
目录
安装
composer require snicco/kernel
定义
Kernel
Kernel
类帮助加载和缓存配置文件,在依赖注入容器中定义服务,并使用任意数量的 引导器 和 包 以受控方式启动应用程序。
引导器
引导器可以是实现 Bootstrapper
接口 的任何类。
引导器是一个负责“引导”应用程序某个统一部分的类。
“引导”可能意味着,例如:在依赖注入容器中注册定义或创建事件监听器。
引导器是配置应用程序的中心位置。
interface Bootstrapper { public function shouldRun(Environment $env): bool; public function configure(WritableConfig $config, Kernel $kernel): void; public function register(Kernel $kernel): void; public function bootstrap(Kernel $kernel): void; }
包
包可以是实现 Bundle
接口 的任何类。该 Bundle
接口扩展了 Bootstrapper
接口。
interface Bundle extends Bootstrapper { public function alias(): string; }
包和引导器的区别在于,包旨在公开分发,而引导器是特定应用程序内部的。
包了解由同一 Kernel
实例使用的其他包。
环境
Kernel
总是需要一个环境来运行。
以下环境是可能的
- 生产
- 预发布
- 开发
- 测试
- 调试(与非生产环境组合使用)
use Snicco\Component\Kernel\ValueObject\Environment; $environment = Environment::prod() $environment = Environment::testing() $environment = Environment::staging() $environment = Environment::dev() $environment = Environment::fromString(getenv('APP_ENV'));
目录
Kernel
总是需要一个 Directories
值对象,该对象定义了以下位置
- 应用程序的基本目录。
- 应用程序的配置目录。
- 应用程序的日志目录。
- 应用程序的缓存目录。
use Snicco\Component\Kernel\ValueObject\Directories; $directories = new Directories( __DIR__, // base directory, __DIR__ .'/config', // config directory __DIR__. '/var/cache', // cache directory __DIR__ . '/var/log' // log directory ) // This is equivalent to the above: $directories = Directories::fromDefaults(__DIR__);
依赖注入容器
Kernel
需要一个 DIContainer
实例,它是一个扩展了 PSR-11 容器接口的抽象类。
目前有两个此接口的实现
您也可以提供自己的实现,并使用snicco/kernel-testing
中的测试用例进行测试。
DIContainer
类是一个抽象类,用于在捆绑包内部使用。
由于捆绑包是分发包,它们不能依赖于特定的依赖注入容器。然而,PSR-11容器接口仅定义了如何从容器中获取服务,而没有定义如何定义服务,这就是为什么使用DIContainer
抽象的原因。
配置文件
在内核启动后,配置目录中的每个.php
文件都将被用来创建一个Config
实例。
您配置目录中的以下配置
// config/routing.php return [ 'route_directories' => [ /* */ ] 'features' => [ 'feature-a' => true, ] ]
将按如下方式加载到配置实例中
$config->get('routing'); $config->get('routing.route_directories'); $config->get('routing.features.feature-a');
kernel.php
配置文件是保留的,因为这是定义捆绑包和引导加载器的地方。
// config/kernel.php use Snicco\Component\Kernel\ValueObject\Environment; return [ 'bundles' => [ // These bundles will be used in all environments Environment::ALL => [ RoutingBundle::class ], // These bundles will only be used if the kernel environment is dev. Environment::DEV => [ ProfilingBundle::class ], ], // Bootstrappers are always used in all environments. 'bootstrappers' => [ BootstrapperA::class ] ]
使用方法
创建内核
use Snicco\Component\Kernel\Kernel; $container = /* */ $env = /* */ $directories = /* */ $kernel = new Kernel( $container, $directories, $env );
启动内核
内核启动时发生的情况与当前环境和配置是否已缓存有关。
$kernel = /* */ $kernel->boot();
启动“未缓存”的内核
- 配置目录中的所有配置文件都将从磁盘加载,以创建
WritableConfig
实例。 - 捆绑包和引导加载器从
kernel.php
配置文件中读取。 - 为所有捆绑包调用
shouldRun()
方法。 - 为所有引导加载器调用
shouldRun()
方法。 - 为所有捆绑包调用
configure()
方法。 - 为所有引导加载器调用
configure()
方法。 WritableConfig
合并到一个文件中,并写入缓存目录(如果当前环境是生产/预发布)。- 为所有捆绑包调用
register()
方法。 - 为所有引导加载器调用
register()
方法。 - 为在
kernel.php
配置文件中定义的捆绑包调用boot()
方法。 - 为在
kernel.php
配置文件中定义的引导加载器调用boot()
方法。 DIContainer
被锁定,无法进行进一步修改。
启动“已缓存”的内核
- 从磁盘加载已缓存的配置文件,并创建一个
ReadOnlyConfig
。 - 从
ReadOnlyConfig
读取捆绑包和引导加载器。 - 为所有捆绑包调用
shouldRun()
方法。 - 为所有引导加载器调用
shouldRun()
方法。 - 为所有捆绑包调用
register()
方法。 - 为所有引导加载器调用
register()
方法。 - 为所有捆绑包调用
boot()
方法。 - 为所有引导加载器调用
boot()
方法。 DIContainer
被锁定,无法进行进一步修改。
-
configure()
方法应用于扩展已加载的配置并验证特定包的配置。 只有当配置尚未缓存时,才会调用configure()
方法。 -
register()
方法应 仅 用于将服务定义绑定到DIContainer
。 -
应使用
boot()
方法从DIContainer
获取服务并在必要时对其进行配置。此时容器已锁定,无法进一步修改服务定义。尝试在包或引导程序的boot()
方法内部修改容器将抛出ContainerIsLocked
异常。
这些方法始终首先在所有包上调用,然后是在所有引导程序上。
这允许引导程序自定义包的行为(如果需要)。
生命周期钩子
内核引导过程中有两个扩展点。
- 从磁盘加载配置之后(只有当配置尚未缓存时)。这是在配置缓存之前修改配置的最后一个机会。
- 在注册所有包和引导程序之后,但在它们启动之前。这是在容器锁定之前修改服务定义的最后一个机会。
use Snicco\Component\Kernel\Configuration\WritableConfig;use Snicco\Component\Kernel\Kernel; $kernel = /* */ $kernel->afterConfigurationLoaded(function (WritableConfig $config) { if( $some_condition ) { $config->set('routing.features.feature-a', true); } }); $kernel->afterRegister(function (Kernel $kernel) { if($some_condition) { $kernel->container()->instance(LoggerInterface::class, new TestLogger()); } }); $kernel->boot();
使用启动的 Kernel
在容器启动后,可以安全地检索所有包提供的服务。
示例
use Nyholm\Psr7Server\ServerRequestCreator; $kernel->boot(); $server_request_creator = $kernel->container()->make(ServerRequestCreator::class); $http_kernel = $kernel->container()->make(HttpKernel::class); $response = $http_kernel->handle($server_request_creator->fromGlobals());
贡献
这个存储库是 Snicco 项目 开发仓库的只读分割。
报告问题和发送拉取请求
请在 Snicco 单一仓库 中报告问题。
安全性
如果您发现安全漏洞,请遵循我们的 披露流程。