auryn高级用法:实例共享、委托和Setter注入全攻略 auryn高级用法实例共享、委托和Setter注入全攻略【免费下载链接】aurynIoC Dependency Injector项目地址: https://gitcode.com/gh_mirrors/au/aurynauryn是一个功能强大的PHP依赖注入容器它通过递归依赖注入帮助您构建SOLID原则的面向对象应用程序。本指南将深入探讨auryn的高级功能包括实例共享、委托注入和Setter注入帮助您充分利用这个强大的IoC工具。为什么需要依赖注入容器 在传统的PHP开发中我们经常面临对象依赖管理的挑战。手动创建和传递依赖不仅繁琐还会导致代码耦合度高、难以测试。auryn通过自动解析类型提示和构造函数参数让依赖管理变得简单高效。auryn的核心优势在于它能够递归实例化类的依赖关系基于类构造函数签名中指定的参数类型提示。这意味着您只需专注于业务逻辑而不必担心对象的创建和组装。实例共享告别单例模式的完美方案 实例共享是auryn最强大的功能之一它让您可以在整个应用程序中共享单个实例同时避免了单例模式带来的测试难题。基本实例共享用法$injector new Auryn\Injector; $injector-share(PDO); $db1 $injector-make(PDO); $db2 $injector-make(PDO); var_dump($db1 $db2); // true是同一个实例数据库连接共享实战在Web应用中数据库连接通常需要全局共享。使用auryn您可以轻松实现这一点$pdo new PDO(mysql:hostlocalhost;dbnamemydb, user, pass); $pdo-setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $injector new Auryn\Injector; $injector-share($pdo); // 所有需要PDO的类都会获得同一个实例 $userRepository $injector-make(UserRepository); $orderRepository $injector-make(OrderRepository);共享规则与优先级auryn的依赖解析遵循明确的优先级顺序如果存在类的共享实例始终返回该共享实例如果为类分配了委托可调用对象则使用其返回结果如果传递给make()的调用时定义则使用该定义如果存在预定义的定义则使用它如果依赖项有类型提示auryn将递归实例化它委托注入灵活的对象创建策略 委托注入允许您完全控制对象的创建过程这对于需要复杂初始化逻辑的对象特别有用。基本委托使用class ComplexService { public $initialized false; public function initialize() { $this-initialized true; } } $factory function() { $service new ComplexService(); $service-initialize(); return $service; }; $injector new Auryn\Injector; $injector-delegate(ComplexService, $factory); $service $injector-make(ComplexService); var_dump($service-initialized); // true支持多种委托类型auryn支持多种委托类型让您可以根据需要选择最合适的方案// 1. 闭包委托 $injector-delegate(MyClass, function() { return new MyClass(); }); // 2. 可调用类委托 class MyFactory { public function __invoke() { return new MyClass(); } } $injector-delegate(MyClass, MyFactory); // 3. 静态方法委托 $injector-delegate(MyClass, MyFactory::create); // 4. 实例方法委托 $injector-delegate(MyClass, [$factoryInstance, createInstance]);参数化委托您甚至可以在委托中注入参数实现更灵活的创建逻辑$injector-define(A, [ a function() { $std new stdClass; $std-foo foo; return $std; }, b function() { $std new stdClass; $std-foo bar; return $std; }, ]);Setter注入后实例化配置的利器 ️虽然构造函数注入是首选但有些API需要在实例化后进行额外的配置。auryn的prepare()方法为此提供了完美的解决方案。基本Setter注入class ConfigurableClass { public $configValue default; public function setConfig($value) { $this-configValue $value; } } $injector new Auryn\Injector; $injector-prepare(ConfigurableClass, function($obj, $injector) { $obj-setConfig(custom_value); }); $instance $injector-make(ConfigurableClass); echo $instance-configValue; // 输出: custom_value批量属性设置您可以在prepare回调中一次性设置多个属性$injector-prepare(UserModel, function($user, $injector) { $user-createdAt new DateTime(); $user-updatedAt new DateTime(); $user-isActive true; $user-lastLogin null; });依赖注入与Setter结合prepare回调还可以访问Injector实例让您注入额外的依赖$injector-prepare(Controller, function($controller, $injector) { $controller-setLogger($injector-make(Logger)); $controller-setCache($injector-make(Cache)); });高级配置技巧 类型提示别名对于接口和抽象类您可以使用别名来指定具体的实现interface LoggerInterface {} class FileLogger implements LoggerInterface {} class DatabaseLogger implements LoggerInterface {} $injector new Auryn\Injector; $injector-alias(LoggerInterface, FileLogger); // 所有需要LoggerInterface的地方都会得到FileLogger实例 $service $injector-make(SomeService);全局参数定义对于在整个应用中重复使用的值可以使用全局参数定义$injector new Auryn\Injector; $injector-defineParam(apiKey, your-api-key-here); $injector-defineParam(debugMode, true); class ApiClient { public function __construct($apiKey, $debugMode) { // 自动注入全局参数 } }原始值注入当需要注入非对象值时使用冒号前缀$injector-define(PDO, [ :dsn mysql:dbnametestdb;host127.0.0.1, :username dbuser, :passwd dbpass ]);实际应用场景 Web应用引导在Web应用中auryn可以优雅地处理路由和控制器的依赖注入$injector new Auryn\Injector; // 共享请求对象 $injector-share($request); // 根据路由动态创建控制器 $controllerClass $router-route($requestUri, $requestMethod); $controller $injector-make($controllerClass); // 调用适当的HTTP方法 $controller-{$requestMethod}();测试友好的架构由于auryn消除了单例模式您的代码变得更容易测试// 在生产环境中 $injector-share($realDatabase); // 在测试环境中 $injector-share($mockDatabase);插件系统实现通过委托注入您可以轻松实现插件系统$injector-delegate(PluginInterface, function() use ($pluginManager) { return $pluginManager-getActivePlugin(); });最佳实践与注意事项 ⚠️避免服务定位器模式重要提示auryn不是服务定位器不要将Injector实例传递给应用程序类。服务定位器是一种反模式它会隐藏类依赖关系使代码难以维护。正确使用时机只在应用程序的引导阶段使用auryn来连接不同的部分。应用程序类应该通过构造函数明确声明它们的依赖关系。性能考虑auryn会缓存反射结果以最小化性能影响。反射比磁盘访问快一个数量级比从远程数据库检索信息快几个数量级。错误处理auryn提供了清晰的错误信息帮助您快速定位问题try { $service $injector-make(SomeService); } catch (Auryn\InjectionException $e) { // 处理依赖注入错误 }总结 auryn的实例共享、委托注入和Setter注入功能为PHP依赖注入提供了强大而灵活的解决方案。通过合理使用这些高级功能您可以消除单例模式提高代码可测试性实现复杂的对象创建逻辑保持代码简洁灵活配置对象支持各种初始化需求构建松耦合的应用程序遵循SOLID原则记住依赖注入容器的真正价值在于帮助您编写更清晰、更可维护、更可测试的代码。auryn通过其优雅的API和强大的功能让这一目标变得触手可及。开始使用auryn的高级功能让您的PHP应用程序架构更上一层楼【免费下载链接】aurynIoC Dependency Injector项目地址: https://gitcode.com/gh_mirrors/au/auryn创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

本周精选

本月热点