2009-11-09 19 views
8

Sto lavorando a un'app in CodeIgniter e desidero avere pagine di amministrazione per molti degli oggetti nell'applicazione e mi chiedo quale sarebbe il modo migliore per inserirli in una struttura MVC.Il modo migliore per creare pagine di amministrazione in CodeIgniter?

Idea 1: In ogni controller, avere una funzione di amministrazione e aggiungere tutte le pagine di amministrazione che desidero in quella funzione. esempio URL: domain.com/articles/admin

Idea 2 Fai un nuovo controller di amministrazione, che avrebbe dovuto fare riferimento a molti modelli diversi, e mettere tutte le pagine di amministrazione in là. URL di esempio: domain.com/admin/articles

Quale modo sarebbe meglio?

Modifica per chiarimento: Per funzionalità di amministrazione, voglio dire essere in grado di eseguire le azioni di base di CRUD su qualsiasi oggetto ed essere in grado di visualizzare un elenco di tutto questo oggetto.

risposta

2

Farò eco a Justin per mantenerlo parte dei singoli controller.

È necessario impostare un tipo di sistema di autorizzazione che i singoli controllori possono utilizzare per stabilire chi ha effettuato l'accesso (nome utente) e quale accesso hanno (amministratore/membro/ecc.). Here's a SO thread on CodeIgniter Auth Classes.

La vista mostrerebbe quindi i collegamenti appropriati in modo condizionale e il controllore applicherà la politica controllando l'autenticazione prima di passare qualsiasi dato al modello o di visualizzare una vista di modifica. In caso di accesso non autorizzato, è possibile eseguire il rendering di un errore o semplicemente renderlo con la vista non di modifica.

Questo approccio sembra avere più senso (almeno per me) perché tutte le funzionalità sono memorizzate nel singolo controller. Mantenere le funzioni di amministrazione in un singolo controller di amministrazione significa che dovrai gestire due controller (l'amministratore e il controller attuale) ogni volta che aggiungi qualcosa di nuovo (o rimuovi qualcosa).

Se si è preoccupati di eseguire il controllo dell'autenticazione in ogni controller, è possibile creare una classe controller generica con tutte le impostazioni di autenticazione, quindi estendere i controller. Alla fine l'individuo di controllo controllore di autenticazione potrebbe essere semplice come:

function edit() 
{ 
    if(!$this->auth()){ 
     //display auth error, or forward to view page 
    } 
} 

Naturalmente qualche tipo di implementazione di ACL renderebbe questo meglio, ma non credo CodeIgniter ha un ACL 'ufficiale'.

+0

Fuori dalla manciata di downvotes - qualcuno si preoccupa di spiegare perché? –

1

A seconda di cosa si intende per funzionalità "Admin" ... in genere, questa viene considerata una visualizzazione "Modifica".

E in genere, si utilizza il controller esistente per servire la vista "Modifica" che consente agli utenti autorizzati di apportare le modifiche (nel proprio caso, solo agli utenti amministratori).

0

Sembra una scelta personale, mi piace avere tutto centralizzato in modo che il controller admin sia la mia scommessa.

In questo modo non avrei dovuto aprire 5 controller diversi modificando le attività di amministrazione.

+1

Questo non si espande bene. il problema qui è che stai mungendo insieme un sacco di codice non correlato. Ogni volta che il motore PHP viene eseguito sul controller, deve compilare TUTTO il tuo back-end e non solo le cose rilevanti per l'azione. –

+0

Posso argomentare il contrario. Le aree di amministrazione non sono ad alta intensità di traffico, le pagine degli utenti sono, e se metti insieme un'area di amministrazione per ogni sezione, il motore deve eseguire su ogni codice di amministrazione che è totalmente irrilevante per l'utente, quindi uno spreco. Eppure, questo non importa davvero con l'uso di code cachers. – pablasso

2

È consigliabile avere una cartella di amministrazione nella cartella dei controller in cui è possibile accedere all'amministrazione, ad es. yoursite.com/admin/users.

Tutte le vostre esigenze amministrative saranno lì e tutti i metodi saranno protetti controllando i privilegi degli utenti in questo modo:

if (! $this->auth->logged_in(array('login', 'admin'))) 
{ 
    $this->session->set_flashdata('message', 'You do not have access to view this page'); 

    redirect('admin/users/login'); 
} 

Poi tutti i controller di fuori della cartella 'admin' saranno - a seconda del tipo di sito - sarà solo per visione, ecc. senza porzioni amministrative.

+0

Lo fai in ogni metodo? Dovresti farlo nel costruttore del controller o di un controller di base per salvare la ripetizione. http://philsturgeon.co.uk/news/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY –

+0

ovviamente puoi farlo in un controller di base. –

6

Definitivamente un controller diverso almeno!

Ero solito pensare che potevo mantenere tutte le mie funzioni di amministrazione in un unico controller, ma con l'aumentare dei miei programmi mi sono reso conto che avevo bisogno di più controller nella mia sezione di amministrazione.

Quindi, ho creato una cartella all'interno della cartella dei miei controller con il nome "admin" e ho inserito tutti i miei controller amministrativi. Così le mie cartelle sarebbero un aspetto simile:

  • applicazione
    • controllori
      • Front.php
      • welcome.php
      • amministratore
        • dashboard.php
        • useradmin.php
  • ecc ...

Un problema questo crea, tuttavia, è quando si digita http://mysite.com/admin nel browser, restituisce una pagina 404. Quindi, vai al tuo file "application/config/routes.php" e aggiungi un percorso personalizzato:

$routes['admin'] = 'admin/dashboard/index'; 
2

L'idea 2 è meglio. system/application/controller/admin

Qui si tengono tutti i controller di amministrazione.

Problemi correlati