のように行うことができますあなたは本当に楽しいし、コードの冒険をしたい場合は、あなたがこのような何かを行うことができますが...
Facade
クラスを作成します。これは、アプリの起動時に初期化する必要があります。あなたには、いくつかのサービスを必要な場所、あなたが作成し、
<?php
namespace MyBundle;
use Symfony\Component\DependencyInjection\ContainerInterface;
class Facade
{
/**
* self|null
*/
private static $instance = null;
/**
* ContainerInterface
*/
private static $myContainer;
/**
* @param ContainerInterface $container
*/
private function __construct(ContainerInterface $container)
{
self::$myContainer = $container;
}
/**
* @param string $serviceId
*
* @return object
* @throws \Exception
*/
public static function create($serviceId)
{
if (null === self::$instance) {
throw new \Exception("Facade is not instantiated");
}
return self::$myContainer->get($serviceId);
}
/**
* @param ContainerInterface $container
*
* @return null|Facade
*/
public static function init(ContainerInterface $container)
{
if (null === self::$instance) {
self::$instance = new self($container);
}
return self::$instance;
}
}
そして:ここFacade
クラスのコードは、
$kernel->boot();
$container = $kernel->getContainer();
\MyBundle\Facade::init($container);
そして:だから、app.php
で、ちょうど行の後$kernel = new AppKernel('prod', false);
はFacade
初期化を行いますそれこの方法:
$service = \MyBundle\Facade::create('my_dependency_service');
しかし、あなたが私に尋ねるならば、私はコンストラクタにコンテナを注入したFacadeサービスを作ります。 サービス作成のためのメソッド(Facade::create($serviceId)
)があります。これは、指定されたサービスIDをコンテナに要求します。
私は同じ名前で多くの質問を見つけましたが、これは別の問題ですので、この質問を重複としてマークする前に注意してください。 –
IoCとDIを使用したくない場合、なぜコンテナが必要なのか理解できません。 –
Container :: getInstance()はグローバルを使用しています。実際には、コンテナにグローバルにアクセスする場合は、グローバル定義を使用する必要があります。それはあなたが気分が良くなるが、それはまだグローバルである場合Laravelのようなファサードと呼んでください。 – Cerad