symfony中使用__construct获取services对象

symfony中服务的使用总所周知的方便,但是当一个controller多次使用到同一个服务的时候就会出现在每个Action中都get获取服务,此时为了省事相信你也尝试使用构造函数申明一个私有对象避免多次使用,如果服务没问题此时使用

private $conn;
private $sql;
public function __construct($container)
{
    $this->conn = $this->get('database_connection');
    $this->sql = $this->get('services.sql');
}

你会得到Error: Call to a member function get() on a non-object
原因是因为$this->container未设置导致,google找到一个解决思路 在你当前的Bundle的YourBundleNameBundle.php文件中写入以下代码

private static $containerInstance = null;
 
public function setContainer(ContainerInterface $container = null)
{
        parent::setContainer($container);
        self::$containerInstance = $container;
}
 
 public static function getContainer()
{
     return self::$containerInstance;
}

此时再Controller中使用

private $conn;
private $sql;
public function __construct($container)
{
    $this->conn = YourBundleNameBundle::getContainer()->get('database_connection');
    $this->sql = YourBundleNameBundle::getContainer()->get('services.sql');
}

就能正常get获取到对象了