2012-04-04 14 views
6

Mi piacerebbe sapere Qual è il modo migliore per includere file php di terze parti in symfony2. Sto usando un diverso pacchetto php - ajax per caricare file nella mia applicazione symfony2. Il pacchetto mi offre un codice php oops che ho bisogno di usare nel mio controller symfony. Sto creando oggetti di quel codice nel mio controller. Quindi mi piacerebbe sapere dove posso mettere quel codice o file di terze parti e come posso includere o creare oggetti di quel codice nel mio controller symfony2. Usiamo require o include anche in symfony2. Se è così è l'unico approccio.Miglior approccio Per includere file di terze parti con Symfony2

risposta

7

Non sono sicuro di provare ad aggiungere spazi dei nomi a una libreria di terze parti. Il ramoscello, per esempio, non usa gli spazi dei nomi. E non c'è davvero bisogno. Si consideri ad esempio un caso in cui si desidera utilizzare il componente PDF dalla libreria Zend_Framework 1.

Nel file app/autoload.php si dovrebbe fare qualcosa di simile:

$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' 

); 

A questo punto dovremmo essere in grado di creare oggetti 3a parte interna del controller, mentre lasciando il sistema di caricamento automatico prendersi cura di trovare e comprese le classi:

$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); 

È necessario utilizzare \ per ovviare alla mancanza di namespace.

Questa risposta presuppone che la libreria di terze parti segua la convenzione di denominazione delle classi più o meno standard. Se ha la sua funzionalità di caricamento automatico, allora basta chiamarlo anche da autolaod.php. E se non si desidera utilizzare l'autoloading, è sufficiente impostare il percorso di inclusione e includerlo.

+1

Questo è il modo corretto per farlo. Se una libreria non segue alcuna convenzione di denominazione, suggerirei di iniziare a usare il compositore ([repo] (https://github.com/composer/composer), [symfony] (https://github.com/symfony/symfony -standard)). Permette la mappatura di qualsiasi libreria, rendendo possibile l'autoloading anche per quelle libs che non seguono la convenzione. – gilden

3

The documentation spiega la struttura della directory in dettaglio.

Fondamentalmente, puoi metterli dove vuoi, ma per coerenza e seguendo le migliori pratiche, dovresti mettere le tue librerie di terze parti nella directory vendor/.

Quindi è possibile includere i file rilevanti con namespace.

+1

Ottima risposta! Ho avuto questa situazione un po 'di tempo fa e l'ho risolto esattamente così ... –

+0

@Hakan Deryal. Grazie per la risposta, puoi dirmi se ho creato una cartella come terza parte nel venditore e ho inserito il mio file di terze parti in tale posizione che vendor/thirdparty/myfile.php come potrei includerlo nel mio pacchetto Acme. – ScoRpion

+0

L'applicazione di terzi utilizza gli spazi dei nomi? Puoi verificarlo cercando una riga nella parte superiore del file come "namespace ...." –

Problemi correlati