2011-11-16 13 views
33

Attualmente sto aggiornando uno dei nostri progetti a CakePHP 2.0. Sfortunatamente la "prima riga" del codice crea problemi e non riesco a trovare una soluzione a questo problema.Caricamento file fornitore in CakePHP 2.0

In CakePHP 1.3 ho avuto una dichiarazione App::import("Vendor", "facebook"); poco prima che venga definita la classe AppController. Il file di riferimento si trova sotto /app/vendors/facebook/facebook.php (e include se stesso il file base_facebook.php).

Ho provato molti modi diversi per includere il file ora in CakePHP 2.0 secondo la denominazione dei file e la classe di carico descritto qui: File naming and class loading changes in CakePHP 2.0

ho rinominato il percorso app/Vendor/Facebook/Facebook.php o app/Vendor/Facebook/facebook.php, e ha cercato seguenti metodi:

App::uses("Facebook", "Vendor/Facebook"); 
App::uses("Facebook", "Facebook"); 
App::uses("Facebook", "Vendor/Facebook/Facebook.php"); 
App::uses("Facebook", "Vendor"); 

Qualcuno ha ancora trovato un modo per fare riferimento a un file fornitore? A causa del pigro caricamento dei metodi sopra riportati non viene emesso un errore/avviso, quindi è un po 'fastidioso eseguire il debug di questo ...

risposta

53

I fornitori non possono essere caricati utilizzando App::uses() in CakePHP, questo perché CakePHP non può aspettarsi che le librerie esterne seguano gli stessi standard per quanto riguarda la denominazione di cartelle e file. Puoi ancora usare App::import('Vendor', ...) come hai fatto nella versione 1.3 del framework.

Ora, usare App::import() per i venditori è una specie di sciocco, se ci pensate. È solo un involucro costoso, prolisso e molto sciocco per require_once().

In 2.0, in realtà incoraggiamo le persone a utilizzare require o require_once per le loro librerie di venditori. È possibile ottenere la posizione della cartella Vendor utilizzando App::path('Vendor') o solo APP . 'Vendor' . DS.

+0

Ciao Jose, thx per la rapida risposta. require_once funziona bene - non ci avevo pensato. Tuttavia, la vecchia sintassi App :: import ("Vendor", ...) non funziona per me. –

+2

Btw, il vecchio utilizzo di App :: import() come mostrato non funzionerà, perché è necessario fornire il percorso relativo alla classe. import() non guarderà più in modo ricorsivo nelle directory per motivi di prestazioni. Ne ho sentito parlare, ma nessun ticket è stato aperto nel tracker dei problemi. Tuttavia, i test unitari per quella caratteristica passano tutti come previsto. Proverò a scrivere un esempio del mondo reale per verificare che funzioni come previsto. Grazie! –

+4

Quindi App :: import ("Vendor", "Facebook/Facebook") dovrebbe fare il trucco nel tuo caso. – mark

0

documentazione torta suggeriamo di utilizzare App :: usi() including-files-with-app-import

Tuttavia, si afferma anche se si dispone di un plugin non stanard da usare App :: import()

App::import('Vendor', 'phpQuery', array('file' => 'bariew/phpquery/phpQuery/phpQuery.php')); 
0

utente si assume 'il file del fornitore si trova /app/vendors/facebook/facebook.php qui.

La riga seguente dovrebbe fare lo stesso come App :: import() nella versione precedente di CakePHP

require_once(ROOT . DS . 'app' . DS .'Vendor' . DS . 'facebook' . DS . 'src' . DS . 'facebook.php'); 

$facebookApi = new facebook();