2013-02-04 5 views
6

Von innerhalb eines Controllers muss ich den Pfad eines Verzeichnisses in einem Bündel abrufen. Also ich habe:Der Pfad eines Verzeichnisses in einem Bündel in Symfony

class MyController extends Controller{ 

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

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

     // ... 
    } 
} 

Wie richtig $directoryPath zu bekommen?

+0

./web/bundles/mybundle kann ein symbolischer Link auf die reale ./mybundle/ressources/public Ordner, die Sie interessieren könnten diese zu erhalten Pfad stattdessen. –

+0

Ich empfehle Ihnen auch $ verzeichnisPfad von einem Parameter mit einer sauberen Service-Definition (wie ein "Uploader" -Dienst), dies ist die symfony Weg. –

Antwort

4

Etwas wie folgt aus:

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

Leider wird Ihr Code den folgenden Code zurückgeben: "C:/xampp/htdocs/projectname/app /../ web/bundles/mybundle/myfiles"! Das ".." wird nicht funktionieren! –

+0

@AliBagheriShakib Ich benutze Windows nicht, aber Sie können wahrscheinlich umgehen, indem Sie dirname() verwenden, um das '/ ..' zu ersetzen: 'dirname ($ this-> container-> getParameter ('kernel.root_dir')) . '/ web/bundles/mybundle/myfiles'' – ChocoDeveloper

+0

Great @ChocoDeveloper! Das ist Arbeit auf Windows.Vielen Dank ... –

52

Es gibt einen besseren Weg, es zu tun:

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

wird einen absoluten Pfad geben AcmeDemoBundle

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

Weg geben die Ressourcen Dir innerhalb AcmeDemoBundle, und so weiter ...

InvalidArgumentException wird ausgelöst, wenn ein solches Verzeichnis/Datei nicht existiert.

Auch auf einer Containerdefinition können Sie verwenden:

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

EDIT

Ihre Dienste müssen nicht hängen von Kernel. Es gibt einen Standard-Symfony-Dienst, den Sie verwenden können: file_locator. Es verwendet Kernel :: locateResource intern, aber es ist einfacher, in Ihren Tests zu verdoppeln/zu verspotten.

Service-Definition

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

Klasse

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/Ressourcen/öffentlich/js); Würde Sie zu einem Pfad zum js-Verzeichnis unter Ressourcen/öffentlich bringen - nicht das 's' für Ressourcen. – Halfstop

+2

Dies sollte definitiv die akzeptierte Antwort sein. – Drumnbass

Verwandte Themen