hudsxn / ioc-core
一个简单的IOC框架,适用于快速API开发,非常适合微服务
This package is auto-updated.
Last update: 2024-09-13 20:41:20 UTC
README
控制反转(IoC)是软件开发中的一个设计原则,旨在将系统的控制流程与实现细节解耦。不是让高层模块直接控制低层模块或组件,而是将这种责任转移到框架或容器。这种关注点的分离增强了模块化和灵活性,使得组件可以被替换或修改而不影响整体系统。IoC最常见的使用是依赖注入,其中外部实体提供必要的依赖,而不是由类自己创建或查找。
实现IoC可以使代码更易于测试和维护,因为它消除了组件之间的直接依赖关系,使得系统更能适应变化。通过反转控制流程,开发者可以专注于编写业务逻辑,同时依靠IoC容器来处理依赖项的连接、生命周期管理和其他跨切面关注点。这个原则是许多现代框架和库的基础,这些框架和库利用IoC来简化开发过程并促进最佳实践。
入门,index.php和cli.php
index.php
<?php require_once('vendor/autoload.php'); use Hudsxn\IocCore\Application; // fileDir, runType, beforeRequest $app = new Application("src", "web", function() { /** * @var \Hudsxn\IocCore\AppRouter */ $router = $this->getApplicationRouter(); $router->setNoRouteAction(function(string $method, string $path) { // do this when not found, you can use this to fallback on frontend apps. }); });
cli.php
<?php require_once('vendor/autoload.php'); use Hudsxn\IocCore\Application; // fileDir, runType, beforeRun $app = new Application("src", "cli", function() { }, $argv);
.env
或环境变量
mysql_host="localhost" mysql_user="root" mysql_charset="utf8" mysql_password="password" mysql_db="my_db"
如果您想使用MySQL,则必须使用此框架的这些字段,这是通过PDO适配器完成的,并采取了安全措施。
为React、Vue和Svelte构建的PHP框架
此框架在设计时考虑到模块化、易用性、可读性和可维护性。
-
快速实体生成
不必单独创建和映射实体到服务,再到控制器;存在一个简单的工具来生成实体、控制器和服务,并具有自动CRUD方法。
php cli.php @build/entity --className=App\Users\User
然后它会生成一个空的实体、服务和控制台,只需添加字段即可创建实体。
-
快速前端开发
编写大量的前端样板代码很乏味,烦人的null引用,将所有实体和端点映射到异步TypeScript或JavaScript函数和类型。
# --sourceType either 'ts' or 'js' php cli.php @build/generate-types --sourceType=ts --outputDir=frontend/api"
-
依赖注入
使用0脚本方法(除index.php和cli.php外),所有依赖项都得到管理并易于访问,依赖注入适用于所有类,只需在类构造函数中传递一个类参数即可。使用此IoC框架的另一个巨大好处是自动对象映射,从输入流(POST、PUT、PATCH)中获取的数据被解析并转换为可读、修改或保存的对象。
-
事件驱动
所有实体都可以使用事件,在实体的生命周期中,将有6个事件被触发,分别是
BeforeCreate
、AfterCreate
、BeforeUpdate
、AfterUpdate
、BeforeDelete
、AfterDelete
,你可以非常容易地利用这些事件。<?php namespace App\MyProject; use Hudsxn\IocCore\Attribute\ListenFor; class ProjectEvents { #[ListenFor('BeforeCreate', Project::class)] public function beforeCreate(Project $entity): Project { // example. $entity->UserId = $this->getUserId(); } #[ListenFor('BeforeUpdate', Project::class)] public function beforeUpdate(Project $mutated, Project $existing): Project { if ($existing->UserId == $mutated->UserId) { return $mutated; } throw new Exception("Not your object"); } }
-
属性优先框架
属性优先的代码库更容易维护和理解,属性在PHP中持有关于目标的信息。属性是这个框架中的神,它们与依赖注入器一起工作,真正赋予这个框架力量。