如果你真的想有一個有趣的和做的代碼出軌,你可以做這樣的事情...
創建一個Facade
類,必須在應用程序啓動時進行初始化。所以,在app.php
,只是行後$kernel = new AppKernel('prod', false);
做Facade
初始化:
$kernel->boot();
$container = $kernel->getContainer();
\MyBundle\Facade::init($container);
而且,這裏是爲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;
}
}
而且,無論你需要一些服務,爲您打造它是這樣的:
$service = \MyBundle\Facade::create('my_dependency_service');
但是,如果你問我 - 我會創建一個Facade服務,這將有一個容器注入構造函數。 而且你會有一些創建服務的方法(Facade::create($serviceId)
),它會向容器詢問給定的服務ID。
我發現很多問題與同名,但這一個關於另一個問題,因此請注意之前,將這個問題標記爲重複。 –
我不明白爲什麼你甚至需要容器,如果你不想使用IoC和DI? –
Container :: getInstance()正在使用全局。事實上,如果你想全球訪問容器,那麼你幾乎需要使用全局定義。如果它讓你感覺更好,但它仍然是一個全球性的,就像Laravel那樣稱之爲門面。 – Cerad