2013-02-04 31 views
6

Từ bên trong bộ điều khiển, tôi cần lấy đường dẫn của một thư mục bên trong một gói. Vì vậy, tôi có:Lấy đường dẫn của một thư mục bên trong một bó trong Symfony

class MyController extends Controller{ 

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

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

     // ... 
    } 
} 

Cách nhận chính xác $directoryPath?

+0

./web/bundles/mybundle có thể là một liên kết tượng trưng đến thư mục ./mybundle/ressources/public thực, bạn có thể quan tâm để có được điều này thay vào đó. –

+0

Ngoài ra, tôi khuyên bạn nên đặt $ directoryPath từ một tham số có định nghĩa dịch vụ sạch (chẳng hạn như dịch vụ "Trình tải lên" thay thế), đây là cách symfony. –

Trả lời

4

Something như thế này:

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

Thật không may mã của bạn sẽ trả về điều này: "C:/xampp/htdocs/projectname/app/../ web/bundles/mybundle/myfiles"! ".." sẽ không hoạt động! –

+0

@AliBagheriShakib Tôi không sử dụng Windows, nhưng bạn có thể nhận được điều này bằng cách sử dụng dirname() để thay thế '/ ..': 'dirname ($ this-> container-> getParameter ('kernel.root_dir')) . '/ web/bundles/mybundle/myfiles'' – ChocoDeveloper

+0

Great @ChocoDeveloper! Đó là công việc trên windows.Cảm ơn bạn ... –

52

Có một cách tốt hơn để làm điều đó:

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

sẽ đưa ra một đường dẫn tuyệt đối đến AcmeDemoBundle

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

sẽ cung cấp đường dẫn đến tài nguyên dir bên trong AcmeDemoBundle, v.v ...

InvalidArgumentException sẽ bị ném nếu thư mục/tệp đó không tồn tại.

Ngoài ra, trên một định nghĩa container, bạn có thể sử dụng:

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

EDIT

dịch vụ của bạn không phải phụ thuộc vào kernel. Có một dịch vụ symfony mặc định bạn có thể sử dụng: file_locator. Nó sử dụng Kernel :: locateResource nội bộ, nhưng sẽ dễ dàng tăng gấp đôi/thử nghiệm trong các thử nghiệm của bạn.

định nghĩa dịch vụ

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

lớp

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/public/js '); Sẽ đưa bạn đến một đường dẫn đến thư mục js trong phần Tài nguyên/công cộng - không phải là 's' cho Tài nguyên. – Halfstop

+2

điều này chắc chắn là câu trả lời được chấp nhận. – Drumnbass

Các vấn đề liên quan