2015-12-08 18 views
6

Ho una nuova classe PHP che vorrei chiamare da un controller. Dove, nella struttura della cartella CakePHP, dovrei posizionare questa nuova classe e qual è la procedura da utilizzare o utilizzare da un controller? Grazie in anticipo per la vostra collaborazione!Dove posizionare una classe PHP personalizzata in CakePHP 3?

+1

Se si desidera utilizzarlo dal controller, perché non è possibile creare un componente? – ADmad

+0

La classe è qualcosa che hai scritto tu stesso per la tua app CakePHP o una risorsa di terze parti? – drmonkeyninja

+0

@drmonkeyninja è una classe di terze parti. Fa qualche differenza? – Jorge

risposta

12

Dal mio punto di vista, è possibile riutilizzare qualsiasi propria classe e anche una terza classe di parti come un programma di utilità classe. In tal caso, è possibile inserire la classe nella cartella src/Utility. Si prega di utilizzare lo spazio dei nomi corretto. Successivamente, puoi usare quella classe ovunque in CakPHP 3.x.

INFORMAZIONI PER:

Di ', di avere una classe di nome Jorge, salvarlo in src/Utility cartella utilizzando il nome del file Jorge.php. Metti la dichiarazione namespace App\Utility; in cima al tuo file Jorge.php.

MODO D'USO:

In quali file che si desidera utilizzare questa classe, appena messo use App\Utility\Jorge;. Successivamente, puoi chiamare la classe in quel file.

soluzione alternativa:

Se si dispone di un terzo pacchetto partito di molte classi, quindi è possibile seguire https://stackoverflow.com/a/28527683/1787600

0

La maggior parte del codice derivato CakePHP che avresti creato rientrerà nella struttura delineata dalla documentazione.

http://book.cakephp.org/3.0/en/intro/cakephp-folder-structure.html

Per "classi di utilità totalmente arbitrarie", come sto cercando di indovinare il vostro senso, CakePHP tratta quelli come "dipendenze di terzi" (concettualmente) e si raccomanda di metterli nella cartella "vendor". Puoi ignorare la loro raccomandazione di non modificare le cose in quella cartella quando il nuovo contenuto è il tuo progetto di utilità.

Per il caricamento, utilizzare la famiglia di funzioni del vecchio php require.

http://book.cakephp.org/3.0/en/core-libraries/app.html

Se vi capita di non essere utilizzando Composer nella vostra applicazione, è necessario caricare manualmente tutti i vendor librerie da soli.

È possibile utilizzare le costanti/funzioni globali di CakePHP per creare i percorsi necessari per require.

http://book.cakephp.org/3.0/en/core-libraries/global-constants-and-functions.html

APP, APP_DIR, WWW_ROOT, ecc

+4

"* Per il caricamento, utilizzare i vecchi php richiedono una famiglia di funzioni. *" - CakePHP utilizza spazi dei nomi e il caricatore automatico di PSR. Non c'è quasi bisogno, tranne quando si usa un codice antico, di usare più richiede. Assicurati solo che lo spazio dei nomi e il percorso coincidano e troverà automaticamente la classe una volta usata. – burzum

+0

Certo, supponendo che sia in grado di creare un file moderno lucido, può utilizzare il caricamento automatico. Tuttavia, se non sta usando una serie completa di utility modernizzate, forse sarà più facile usare una vecchia scuola "include", come quando si introduce in una libreria di terze parti vecchia scuola? E se si assicurasse di scrivere una funzione invece di una classe? La domanda di OP era focalizzata sulla classe, ma il caso più generale è "Vorrò caricare qualsiasi cosa da un file, magari anche alcuni dati/immagini/suoni/video usando un set di librerie ben fatto e vecchio che non si adatta Autoload PSR ". – starlocke

0

si può mettere da nessuna parte che si desidera in/src/cartella. È possibile raccogliere le classi personalizzate in cartelle come: Interfaccia, DTO, Utility, Personalizzata o qualsiasi altra cosa. Poiché cakePHP 3.x utilizza il caricatore automatico PSR-4, la classe verrà istanziata una volta utilizzata. Devi solo ricordare di aggiungere uno spazio dei nomi corretto. Ad esempio, se si desidera utilizzare l'interfaccia personalizzata, aggiungere il file src/Personalizzato/Di proprietà.php

<?php 
namespace App\Custom; 
interface Owned 
{ 
    /** 
    * Find username owning object by object primary id 
    * @param $id 
    * @return string|int 
    */ 
    public function owner($id) : string; 
} 
... 

Quindi è possibile utilizzare subito:

... 
class UsersTable extends Table implements Owned 
{ 
... 

Se hai intenzione di riutilizzare le classi soluzione migliore potrebbe essere quella di creare il proprio pacchetto di Packagist e includerlo dal compositore in modo che sarà memorizzata in "/ vendor"