2012-04-04 5 views
6

Ich würde gerne wissen, Was ist der beste Weg, um Drittanbieter-PHP-Dateien in symfony2 einzuschließen. Ich benutze ein anderes php - ajax Paket zum Hochladen von Dateien in meiner symfony2 Anwendung. Das Paket bietet mir einige PHP-Codes, die ich in meinem Symfony-Controller verwenden muss. Ich erstelle Objekte dieses Codes in meinem Controller. Also würde ich gerne wissen, wo ich den Code oder die Datei von Drittanbietern platzieren kann und wie ich Objekte dieses Codes in meinen Symfony2-Controller einbinden oder erstellen kann. Verwenden wir in symfony2 auch require oder include. Wenn ja, ist das der einzige Ansatz.Der beste Weg, um 3rd-Party-Dateien mit Symfony2 zu integrieren

Antwort

7

Ich bin nicht so sicher über den Versuch, Namespaces zu einer Drittanbieter-Bibliothek hinzuzufügen. Twig zum Beispiel verwendet keine Namensräume. Und das ist wirklich nicht nötig. Betrachten Sie zum Beispiel einen Fall, in dem Sie die PDF-Komponente aus der Bibliothek Zend_Framework 1 verwenden möchten.

In Ihrem app/autoload.php Datei, die Sie so etwas wie tun würde:

$loader->registerPrefixes(array(
    'Twig_Extensions_' => $ws . 'Symfony/vendor/twig-extensions/lib', 
    'Twig_'   => $ws . 'Symfony/vendor/twig/lib', 
    'Zend_'   => $ws . 'ZendFramework-1.0.0/library', 
)); 

// And since Zend internally uses require/include we need to set an include path 
ini_set('include_path','.' . 

    PATH_SEPARATOR . $ws . 'ZendFramework-1.0.0/library' 

); 

An dieser Stelle sollten wir dritten Teil Objekte innerhalb der Controller erstellen können, während der Vermietung der Autoload-System kümmern zu finden und zu einschließlich der Klassen:

$page = new \Zend_Pdf_Page(\Zend_Pdf_Page::SIZE_A4); 
    $doc->pages[] = $page; 

    $font1 = \Zend_Pdf_Font::fontWithName(\Zend_Pdf_Font::FONT_HELVETICA); 
    $font2 = \Zend_Pdf_Font::fontWithName(\Zend_Pdf_Font::FONT_COURIER_BOLD); 

Sie müssen die \ verwenden, um den Mangel an Namespacing zu umgehen.

Diese Antwort geht davon aus, dass Ihre 3rd-Part-Bibliothek der mehr oder weniger standardisierten Klassenbenennungskonvention folgt. Wenn es seine eigene automatische Ladefunktion hat, dann rufen Sie es einfach von autolaod.php. Und wenn Sie das Autoloading überhaupt nicht verwenden möchten, legen Sie einfach den Include-Pfad und das Include fest.

+1

Dies ist der richtige Weg, um es zu tun. Wenn eine Bibliothek keiner Namenskonvention folgt, würde ich vorschlagen, mit composer ([repo] (https://github.com/composer/composer), [symfony] (https://github.com/symfony/symfony) zu beginnen -Standard)). Es ermöglicht das Mappen einer beliebigen Bibliothek, wodurch das Autoloading auch für solche Bibliotheken möglich wird, die nicht der Konvention folgen. – gilden

3

The documentation erklärt die Verzeichnisstruktur im Detail.

Im Grunde können Sie sie überall hin mitnehmen, aber aus Gründen der Konsistenz und der Best Practices sollten Sie die Bibliotheken von Drittanbietern in das Verzeichnis vendor/ einfügen.

Dann können Sie die relevanten Dateien mit Namespaces einschließen.

+1

Große Antwort! Ich hatte diese Situation eine Weile zurück und löste es genau so ... –

+0

@Hakan Deryal. Vielen Dank für Ihre Antwort, können Sie mir bitte sagen, wenn ich einen Ordner als ThirdParty im Vendor erstellt habe und meine ThirdParty-Datei dort so platzieren, dass Vendor/ThirdParty/Myfile.php wie könnte ich es in meinem Acme Bundle aufnehmen. – ScoRpion

+0

Verwendet die Drittanbieteranwendung Namespaces? Sie können es überprüfen, indem Sie nach einer Zeile am Anfang der Datei wie 'Namespace ....' suchen. –

Verwandte Themen