11

コントローラ内から、バンドル内の 1 つのディレクトリのパスを取得する必要があります。ので、私は持っています:

class MyController extends Controller{

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

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

        // ...
    }
}

正しく取得するには$directoryPath

4

2 に答える 2

83

それを行うより良い方法があります:

$this->container->get('kernel')->locateResource('@AcmeDemoBundle')

AcmeDemoBundle への絶対パスを指定します

$this->container->get('kernel')->locateResource('@AcmeDemoBundle/Resource')

AcmeDemoBundle 内の Resource dir へのパスを指定するなど...

そのようなディレクトリ/ファイルが存在しない場合、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');
   }
}
于 2014-04-02T19:57:06.790 に答える
2

このようなもの:

$directoryPath = $this->container->getParameter('kernel.root_dir') . '/../web/bundles/mybundle/myfiles';
于 2013-02-04T04:41:35.587 に答える