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');
}
}
./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 đó. –
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. –