5

Sto lavorando a una revisione di un'applicazione CakePHP che ho creato con CakePHP 1.2. Ho aggiornato a 1.3 e sto considerando di allontanarmi dal paradigma di routing dell'amministratore per la mia applicazione. Sto scoprendo che alcuni dei miei controller stanno diventando estremamente grandi a causa delle funzioni duplicate per il front end e l'amministratore. La mia intuizione è che è molto più semplice creare semplicemente un set di controller di amministrazione e eliminare tutti i routing di amministrazione, ma volevo ottenere informazioni su ciò che gli altri stanno facendo e su quale funzionalità, se non presente, mi mancherò lasciando cadere il routing.CakePHP Best Practice: amministratore con o senza routing

Quali sono le migliori pratiche considerate per una solida app CakePHP (o altro framework MVC) a questo proposito?

+0

ho ricevuto due proposte di abbandonare il routing, che sono propenso a fare, ma appena ho iniziato a provarlo mi sento come se avessi colpito un muro di mattoni. In un'applicazione non con framework, creerei solo una nuova directory "admin" e inserirò tutti i miei controller specifici dell'amministratore, molti dei quali avrebbero lo stesso nome dei controller front-end e saranno quindi accessibili: "/ admin/utenti/aggiungere". Non sto trovando alcun modo per fare qualcosa di simile con Cake. La mia unica opzione/admin_users/add? – seth

risposta

0

Non preoccuparti del routing di amministrazione se non si adatta allo scenario. Inoltre, non lo utilizzo, i percorsi di amministrazione non si adattano alla mia app. Duplicare il codice è totalmente uno spreco di energie.

È possibile utilizzare le regole ACL per i ruoli a grana fine o semplicemente controllare il ruolo (flag di amministrazione) nel controller beforeFilter() o nella prima riga di un'azione.

Ho una funzione componente checkRole (array()), chiamata nella prima riga delle mie azioni. Se l'utente corrente non ha i ruoli forniti, registra e termina la richiesta.

0

Avrei usato secondo ACL/ruoli per roba di amministrazione vera e probabilmente non utilizzando il routing di amministratore in produzione. A volte tengo un instradamento admin (così minimo di codice aggiuntivo) per gli admin di basso livello, accessibile solo a me, ma probabilmente non è saggio in una robusta app di produzione.

Modifica dopo commento: Non è ottimale, ma potresti essere in grado di mettere insieme qualcosa che apparirà come desideri negli URL, e anche essere organizzato in cartelle. Non sono ancora riuscito a testarlo, ma ecco l'idea:

Creare una cartella "admin" nella cartella dei controller e per l'amministratore degli utenti, creare un file di controller users_admin_controller.php. Comprimono la struttura delle cartelle, quindi non è possibile avere lo stesso nome della directory principale, ma è comunque possibile separarle in una cartella.

Questa volontà di default fare una situazione /admin_users/add tipo, ma che può essere modificato con la seconda parte, un po 'di routing:

Router::connect('/admin/users/:action', array('controller'=>'admin_users')) 

Ciò dovrebbe essere fatto per ogni sezione di amministrazione - non è l'ideale, ma io non riesco a capire un modo migliore senza modificare il codice Cake.

+0

Allora, che aspetto hanno gli URL della tua sezione di amministrazione? Credo che questo sarebbe un gioco da ragazzi, tranne che non esiste un buon modo per mettere i controller in sottodirectory a cui si accede tramite/subdir/control/action (ad es./Admin/users/add). Hai appena nominato tutti i tuoi controller admin con "admin" anteposto (ad es./Admin_users/add)? – seth

+0

Se si utilizza ACL/ruoli, ci sono solo pagine/azioni che sono solo accessibili agli amministratori o hanno funzionalità aggiuntive con gli amministratori. Ma quello che penso tu stia chiedendo è quando usi lo scaffolding, o con le sezioni di amministrazione. Lì, puoi usare "admin routing" per avere l'amministratore/gli utenti/aggiungere come vuoi. Vedi il manuale CakePHP: http://book.cakephp.org/view/46/Routes-Configuration#Prefix-Routing-544 Con che basta un 'admin_add' funzione nel vostro controller gli utenti, a cui si accede tramite '/ admin/users/add', e poi una normale funzione' add' a cui si accede tramite '/ users/add'. – cincodenada

+0

Capisco perfettamente (e ho implementato) ACL/Ruoli e non sto usando lo scaffolding. Ho solo un sacco di controller di sezione front-end/admin che sarebbero uguali. Mi piacerebbe mettere i controller admin in una sottodirectory "/ admin" e avere URL come "/ admin" senza usare i prefissi. – seth

0

Ho usato ACL per la mia applicazione e lo trovo molto meglio rispetto all'utilizzo del routing di amministrazione. È molto più facile. Se vuoi davvero un prefisso, puoi farlo con il normale routing.

+0

Ho finito per usare il prefisso ACL + (che in realtà non è davvero un cambiamento rispetto alla mia implementazione originale). Sono ancora piuttosto infastidito dal modo in cui la torta gestisce le strutture delle directory e i nomi di file e collegamenti. Sarebbe ideale se un controller si trovasse in una directory "admin" che diventasse parte del percorso dell'URL. – seth

1

Suggerirei di separare semplicemente l'applicazione di front-end e l'amministrazione in due applicazioni separate (/app e /admin). Basta pensare a admin come a una semplice applicazione front-end, facendo tutto il lavoro "sporco" con il database.

Così facendo, sarete in grado di accedere all'amministratore utilizzando/admin prefisso nell'URL o impostare DocumentRoot su/admin/webroot e accedere ad admin utilizzando il sottodominio (ad esempio admin.myapp.com).

Per evitare la duplicazione del codice del modello, si potrebbe mettere i vostri modelli in qualche cartella condivisa (cioè /vendors/core/models) e aggiungere questo percorso per modellare i percorsi in bootstrap.php file (App::build('models' => array(VENDORS . 'core/models/')) per CakePHP 1.3, $modelPaths = array(VENDORS . 'core/models/') per CakePHP 1.2).

per aggiungere più admin o roba specifica applicazione per i vostri modelli, si potrebbe estendere i vostri modelli di base in/modelli, caricando modello di base ed estendendolo:

App::import('Model', 'CoreModelName'); 

class CustomCoreModelA extends CoreModelA 
{ 
    function specificMethod() {} 
} 

che potrebbe essere fatto per i componenti condivisi, comportamenti , ecc.

+1

sull'utilizzo di due app, sarei d'accordo ed è qualcosa che ho comunque circa. ma il tuo mettere modelli nei venditori è un brutto scherzo. usa invece APP :: build nell'unica app per puntare ai file del modello in un'altra app. ci sono problemi con questo specialmente quando si tratta di plugin. molto lento guardando in così tanti dirs. – dogmatic69

+0

Hai ragione, mettere i modelli condivisi in/vendors dir è brutto e hacky, usando altri modelli di app dir per cercare i suoni migliori dei modelli. L'unico problema è la mancanza di spazi dei nomi, in questo modo dovresti anteporre tutti i tuoi modelli di amministratore. Che dire delle prestazioni? Bene, devi scegliere se avere un'architettura pulita e manutenibile o un'app lampo veloce, ma con molti svantaggi architettonici. – ljank

1

ive le app create utilizzando il routing di amministrazione e non, e la versione non è sempre un casino. se alcuni dei tuoi metodi sono uguali puoi fare quanto segue.

function add(){ 
$this->_add(); 
} 

function admin_add(){ 
$this->_add(); 
} 

function _add(){ 
... your code ... 
} 

Sono pronto a scommettere la sua non tutto il codice che è lo stesso, e che non utilizzano amministratore di routing vi ritroverete con un sacco di codice fare if(... is admin ...) { echo 'blaa'} else { echo 'foo'; }