2013-02-04 66 views
6

'daki bir dizinin içinde bir dizinin yolunu bulun Bir denetleyicinin içinden bir dizinin içinde bir dizinin yolunu bulmam gerekiyor. Yani var:Symfony

class MyController extends Controller{ 

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

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

     // ... 
    } 
} 

Nasıl doğru $directoryPath alınır? Böyle

+0

./web/bundles/mybundle gerçek ./mybundle/ressources/public klasöre bir sembolik, bunu elde etmek ilginizi çekebilir olabilir bunun yerine yol. –

+0

Ayrıca, temiz bir hizmet tanımı (bunun yerine bir "Yükleyici" hizmeti) olan bir parametreden $ directoryPath ayarlamanızı öneririm, bu bir symfony yoludur. –

cevap

4

şey:

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

Kaynak yolunu verecek

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

AcmeDemoBundle için mutlak bir yol verecektir:

$directoryPath = $this->container->getParameter('kernel.root_dir') . '/../web/bundles/mybundle/myfiles'; 
+0

Maalesef kodunuz şöyle geri dönecektir: "C:/xampp/htdocs/projectname/app /../ web/bundles/mybundle/myfiles"! ".." işe yaramayacak! –

+0

@AliBagheriShakib Windows kullanmıyorum, ancak '/ ..': 'dirname ($ this-> container-> getParameter ('kernel.root_dir') ile değiştirmek için dirname() 'i kullanarak bunu yapabilirsiniz. . '/ web/bundles/mybundle/myfiles' – ChocoDeveloper

+0

Harika @ChocoDeveloper! Bu windows.Thank üzerinde çalışıyorum ... –

52

bunu yapmak için daha iyi bir yol yoktur AcmeDemoBundle içinde dir, ve böylece ...

Böyle bir dir/dosya yoksa InvalidArgumentException atılır. Ayrıca

, bir konteyner tanımı, şunları kullanabilirsiniz:

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

DÜZENLEME

Hizmetleriniz kernel bağlı gerekmez. Kullanabileceğiniz varsayılan bir symfony hizmeti vardır: file_locator. Dahili olarak Kernel :: locateResource'u kullanır, ancak testlerinizi iki kez eşleştirmeniz daha kolaydır.

hizmet tanımı

my_service: 
    class: AppBundle\Service 
    arguments: ['@file_locator'] 

sınıf

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'); 
    } 
} 
+0

$ this-> container-> get ('kernel') -> locateResource ('@ AcmeDemoBundle/Resources/genel/js'); Kaynaklar için 's' değil, kaynaklar/public altındaki js dizinine giden bir yol alırsınız. – Halfstop

+2

bu kesinlikle kabul edilen cevap olmalıdır. – Drumnbass