从控制器内部我需要获取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)
像这样的东西:
$directoryPath = $this->container->getParameter('kernel.root_dir') . '/../web/bundles/mybundle/myfiles';
Run Code Online (Sandbox Code Playgroud)