获取Symfony中包内的目录路径

Man*_*tto 8 symfony

从控制器内部我需要获取bundle中一个目录的路径.所以我有:

class MyController extends Controller{

    public function copyFileAction(){
        $request = $this->getRequest();

        $directoryPath = '???'; // /web/bundles/mybundle/myfiles
        $request->files->get('file')->move($directoryPath);

        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

怎么弄错$directoryPath

bie*_*era 74

有一种更好的方法:

$this->container->get('kernel')->locateResource('@AcmeDemoBundle')
Run Code Online (Sandbox Code Playgroud)

将给出AcmeDemoBundle的绝对路径

$this->container->get('kernel')->locateResource('@AcmeDemoBundle/Resource')
Run Code Online (Sandbox Code Playgroud)

将在AcmeDemoBundle中提供Resource dir的路径,依此类推......

如果此类目录/文件不存在,将抛出InvalidArgumentException.

此外,在容器定义上,您可以使用:

my_service:
class: AppBundle\Services\Config
    arguments: ["@=service('kernel').locateResource('@AppBundle/Resources/customers')"]
Run Code Online (Sandbox Code Playgroud)

编辑

您的服务不必依赖于内核.您可以使用默认的symfony服务:file_locator.它在内部使用Kernel :: locateResource,但在测试中更容易加倍/模拟.

服务定义

my_service:
    class: AppBundle\Service
    arguments: ['@file_locator']
Run Code Online (Sandbox Code Playgroud)

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');
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 这肯定应该是公认的答案. (3认同)

Cho*_*per 2

像这样的东西:

$directoryPath = $this->container->getParameter('kernel.root_dir') . '/../web/bundles/mybundle/myfiles';
Run Code Online (Sandbox Code Playgroud)