有一个更好的方法来做到这一点:
$this->container->get('kernel')->locateResource('@AcmeDemoBundle')
将给出 AcmeDemoBundle 的绝对路径
$this->container->get('kernel')->locateResource('@AcmeDemoBundle/Resource')
将给出 AcmeDemoBundle 中 Resource 目录的路径,依此类推...
如果这样的目录/文件不存在,将抛出 InvalidArgumentException。
此外,在容器定义中,您可以使用:
my_service:
class: AppBundle\Services\Config
arguments: ["@=service('kernel').locateResource('@AppBundle/Resources/customers')"]
编辑
您的服务不必依赖于kernel。你可以使用一个默认的 symfony 服务:file_locator。它在内部使用Kernel::locateResource,但在测试中更容易加倍/模拟。
服务定义
my_service:
class: AppBundle\Service
arguments: ['@file_locator']
班级
namespace AppBundle;
use Symfony\Component\HttpKernel\Config\FileLocator;
class Service
{
private $fileLocator;
public function __construct(FileLocator $fileLocator)
{
$this->fileLocator = $fileLocator;
}
public function doSth()
{
$resourcePath = $this->fileLocator->locate('@AppBundle/Resources/some_resource');
}
}