skrz / autowiring-bundle
基于注解的Symfony 4依赖注入容器自动装配
Requires
- php: ~7.1
- doctrine/annotations: ~1.5
- symfony/config: ~3.4|~4.0
- symfony/dependency-injection: ~4.0
- symfony/http-kernel: ~4.0
Requires (Dev)
- phpunit/phpunit: ~6.5
This package is not auto-updated.
Last update: 2024-09-13 13:44:08 UTC
README
基于注解的Symfony 4依赖注入容器自动装配
安装
将作为Composer依赖项添加
$ composer require skrz/autowiring-bundle
然后将 SkrzAutowiringBundle
添加到 Symfony Kernel
use Skrz\Bundle\AutowiringBundle\SkrzAutowiringBundle; class AppKernel { public function registerBundles() { return [ ... new SkrzAutowiringBundle() ... ]; } }
用法
使用 @Component
注解及其子类,或所谓的 "特征" 来注解您的应用程序组件。预定义的特征包括 @Controller
、@Repository
和 @Service
,例如:
use Skrz\Bundle\AutowiringBundle\Annotation\Controller; /** * @Controller */ class HomepageController { ... }
通过继承 @Component
创建您自己的应用程序特征。
构造函数依赖注入
// services.yml services: Example\HomepageController: ~
namespace Example; use Skrz\Bundle\AutowiringBundle\Annotation\Controller; /** * @Controller */ class HomepageController { /** * @var SomeService */ private $someService; public function __construct(SomeService $someService) { $this->someService = $someService; } ... }
SomeService
在容器中创建 HomepageController
实例时自动注入。
注意:如果没有在 services.yml
中指定足够的 arguments
,则构造函数将 始终 自动注入。如果您真的不想构造函数自动注入,请将服务添加到 ignored_services
配置指令中。
注意:如果您需要指定某些构造函数参数并自动注入其他构造函数参数,则需要按照以下方式配置您的服务
// services.yml services: Example\HomepageController: arguments: someParameter: %kernel.whatever%
namespace Example; use Skrz\Bundle\AutowiringBundle\Annotation\Controller; /** * @Controller */ class HomepageController { /** * @var SomeService */ private $someService; /** * @var string */ private $someParameter; public function __construct(SomeService $someService, $someParameter) { $this->someService = $someService; $this->someParameter = $someParameter; } ... }
$someService
参数是自动注入的,而 $someParameter
参数则根据配置注入。
方法依赖注入
// services.yml services: Example\HomepageController: ~
namespace Example; use Skrz\Bundle\AutowiringBundle\Annotation\Controller; use Skrz\Bundle\AutowiringBundle\Annotation\Autowired; /** * @Controller */ class HomepageController { /** * @var SomeService */ private $someService; /** * @param SomeService $someService * @return void * * @Autowired */ public function setSomeService(SomeService $someService) { $this->someService = $someService; } ... }
属性依赖注入
// services.yml services: Example\HomepageController: ~
namespace Example; use Skrz\Bundle\AutowiringBundle\Annotation\Controller; use Skrz\Bundle\AutowiringBundle\Annotation\Autowired; /** * @Controller */ class HomepageController { /** * @var SomeService * * @Autowired */ public $someService; ... }
注意:使用属性依赖注入相当上瘾。
属性参数注入
您还可以使用 @Value
注解注入容器参数。
// services.yml services: Example\HomepageController: ~
namespace Example; use Skrz\Bundle\AutowiringBundle\Annotation\Controller; use Skrz\Bundle\AutowiringBundle\Annotation\Value; /** * @Controller */ class HomepageController { /** * @var string * * @Value("%kernel.root_dir%") */ public $rootDir; ... }
小贴士:始终注入标量值,不要注入数组。当您注入标量值时,容器编译期间会验证它们的存在。
自动扫描
自动扫描是 SkrzAutowiringBundle
1.x 版本的一个功能。然而,由于 Symfony 4.0 的推出,容器原生支持 此功能。因此,它已从包中删除,您应使用 resource
关键字导入服务目录。
// services.yml services: Example\: resource: "../path/to/controllers/*Controller.php"
namespace Example; use Skrz\Bundle\AutowiringBundle\Annotation\Controller; use Skrz\Bundle\AutowiringBundle\Annotation\Autowired; /** * @Controller */ class HomepageController { /** * @var SomeService * * @Autowired */ public $someService; ... }
配置
# container extension key is "autowiring" autowiring: # these service IDs won't be processed by autowiring ignored_services: # either specify exact service IDs - kernel - http_kernel # or use regular expressions (they must start with "/") - /^debug\./ - /^file/ # match interfaces to exact services preferred_services: Psr\Log\LoggerInterface: logger Monolog\Logger: logger Symfony\Component\HttpFoundation\Session\Storage\SessionStorageInterface: session.storage.native # if you create your own stereotypes, you must add then here fast_annotation_checks: [ @Task, @Widget ]
许可证
MIT 许可证。查看 LICENSE 文件。