2010-10-13 8 views
5

Chiedendosi se questo è possibile o una limitazione di PHP, googling sembra essere il caso, ma forse mi manca una soluzione intelligente qui.Codeigniter e multiple Ereditarietà?

Speriamo che questo abbia senso. In questo momento ho due parti del mio sito, un amministratore e un client. Sono stato in grado di dividerlo in due controller (admin e client) che ereditano da una classe base MY_Controller, ma il problema che ho è l'implementazione del mio controller di autenticazione.

C'è un sacco di codice condiviso tra gli accessi client/admin, e al momento dovrei creare un controller di autenticazione per ogni amministratore e client che estende la base (che significa un codice molto ripetuto), oppure basta estendere la classe MY_Controller e usare if/thens in ogni funzione, che diventa quindi un po 'disordinata (e ignora anche le classi genitore/client client che sconfigge lo scopo di averle ...).

Mi chiedo se c'è un modo per avere il controller Auth "neutro" (?) E in grado di ereditare dai controller admin/client, quindi se X è il controller di base e Y è l'Auth ...

X -> Admin Controller -> Y 
X -> Client Controller -> Y 

Se si utilizza una libreria di autenticazione per incapsulare alcune delle funzioni di livello più basso e preferirei non essere attaccare logica di layout e cose del genere in là. Perdonami se questa è una domanda stupida. Grazie!

+0

se hai trovato un'altra risposta quindi rinominare questo argomento per [chiusa] o contrassegnare una risposta come la risposta – ITroubs

risposta

3

L'ereditarietà multipla non è possibile. È possibile utilizzare le interfacce oppure è possibile utilizzare il visitatore designpattern in questo modo:

<?php 

class A { 
    public $avar = 'I\'m A'; 
    function accept(Visitor $v){ 
     $v->visitA($this); 
    } 
} 

class B { 
    public $bvar = 'B reporting'; 
    function accept(Visitor $v){ 
     $v->visitB($this); 
    } 
} 


class Visitor { 
    function visitA(A $a){ 
     echo $a->avar; 
    } 

    function visitB(B $b){ 
     echo $b->bvar; 
    } 
} 


$A = new A(); 
$B = new B(); 
$visitor = new Visitor(); 

$A->accept($visitor); 
$B->accept($visitor); 

?> 

purtroppo PHP non è ancora pronto per distinguere le chiamate di metodo per la loro parametri come in Java, dove questo esempio sarebbe simile a quello:

class A { 
    public String avar = 'I\'m A'; 
    function accept(Visitor v){ 
     v.visit(this); 
    } 
} 

class B { 
    public String bvar = 'B reporting'; 
    function accept(Visitor v){ 
     v.visit(this); 
    } 
} 


class Visitor { 
    function visit(A a){ 
     System.out.println(a.avar); 
    } 

    function visit(B b){ 
     System.out.println(b.bvar); 
    } 
} 


A = new A(); 
B = new B(); 
visitor = new Visitor(); 

A.accept(visitor); 
B.accept(visitor); 

in cui si dispone di più metodi di visita che si distinguono per il tipo di loro parametri

+0

quindi qui puoi fare qualcosa come Admincontroller-> accettare ($ visitatore) e nel visitatore hai due metodi uno è chiamato visitAdmin e l'altro è chiamato visitUser E quando non conosci il tipo di controller che deve essere visitato non è un problema perché tu dai il controller al visitatore e decide quale metodo visitatore chiamare – ITroubs

+0

Devi anche implementare una piccola interfaccia visitatore con solo il metodo accept e lasciare che i due controller implementino quell'interfaccia in modo che tu possa usare typehinting nei tuoi metodi dove date il vostro controller in modo che possiate essere shure hanno quel metodo di accettazione – ITroubs

+0

Cercare di giocare con questo metodo! – Jeff

0

L'ereditarietà multipla non è possibile con PHP. Mi chiedo però, perché avresti bisogno di due controller di accesso separati? Potresti spiegare cosa stai facendo nei controller?

MODIFICA:
Non sono sicuro se il codice lo consente, ma è possibile provare a inserire tutte le parti generali nel controller client e lasciare che il controller di amministrazione si estenda da questo.

X -> Admin Ctrlr -> Client Ctrlr -> Y 
X -> Client Ctrlr -> Y 
+0

Beh io ho la logica separata per il login/regist a seconda che l'utente si trovi nella parte amministrativa o client del sito web. Ad esempio, se l'utente si registra nella parte amministrativa, elaboro altri campi modulo o chiedo un codice di invito, ecc. Esistono anche porzioni di accesso uguali, come la dimenticanza della password, il reset, ecc. – Jeff