我正在为社区开发一个捆绑包。
我的捆绑包有一项服务来获取一些内容。我有一个名为 Providers 的文件夹,其中包含一些提供程序和一个AbstractProvider
类。我的所有提供商都扩展了AbstractProvider
。
当开发人员使用"my_class"
之类的字符串调用我的服务函数时,我使用此名称从我的提供者实例化该类:
<?php
new MyClass();
在 Providers 文件夹中,我有一些常见的提供程序,但我想允许开发人员添加自己的提供程序(扩展我的AbstractProvider
类)。我的服务必须使用类名实例化此自定义提供程序。
我如何实现这一目标?
这是我的树:
MyBundle
└── Toto
└── Providers
├── AbstractProvider.php
├── ArticleProvider.php
├── BlockRubricProvider.php
├── CommuniqueProvider.php
├── HomepageProvider.php
├── OffreurSolutionsProvider.php
├── PartenaireProvider.php
├── PresseProvider.php
└── PublicationProvider.php
我的服务:
class MyServiceProvider
{
public function __construct() { }
/* $providerName exemple: "my_provider" */
public function getProvider( $provierName )
{
$providerClass = str_replace('_', '', ucwords($contentType->identifier, '_'))."Provider";
/** @var AbstractProvider $provider */
$provider = new $providerClass( $provierName );
return $provider;
}
}
如何让开发人员拥有自己的文件夹提供商及其提供商,并允许我的服务使用此系统对其进行实例化?
也许是这样的?
use **\Toto\Providers\*;
谢谢!
答案 0 :(得分:1)
为什么不使用完整的被叫名称?在这种情况下,您不需要包含任何用途。您可以使用配置包(如here)配置提供程序,在AbstractProvider中,您可以放置一个抽象方法,为用户用来调用它的提供程序命名。
我希望可以帮到你