2010-10-13 52 views
5

Preguntándome si esto es posible o una limitación de PHP, parece que es el caso de buscar en Google, pero tal vez me falta una solución inteligente aquí.Codeigniter y Herencia Múltiple?

Espero que esto tenga sentido. En este momento tengo dos porciones en mi sitio, un administrador y un lado del cliente. Pude dividirlo en dos controladores (administrador y cliente) que heredan de una clase base MY_Controller, pero el problema que tengo es la implementación de mi controlador de autenticación.

Hay un montón de código compartido entre los inicios de sesión del cliente/administrador, y ahora tendría que crear un controlador de autenticación para cada administrador y cliente que extienda la base (lo que significa un código repetido), o simplemente extienda la clase MY_Controller y use if/thens en cada función, que luego se torna un poco desordenada (y también pasa por alto las clases padre del administrador/cliente, lo cual frustra el propósito de tenerlas ...).

Me pregunto si hay una forma de que el controlador Auth sea "neutral" (?) Y capaz de heredar de los controladores admin/client, entonces si X es el controlador base, y Y es el Auth ...

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

estoy usando una librería de autenticación para encapsular algunas de las funciones de nivel más bajo y más bien no estaría pegando la lógica de diseño y cosas por el estilo en ese país. Perdóname si esta es una pregunta estúpida. ¡Gracias!

+0

si encuentra otra respuesta cambie el nombre a este tema [cerrada] o marcar una respuesta como la respuesta – ITroubs

Respuesta

3

Herencia múltiple no es posible. O se puede utilizar las interfaces o puede utilizar el visitante designpattern así:

<?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); 

?> 

lamentablemente PHP no está listo todavía para distinguir las llamadas de método por su parámetro como en java en este ejemplo se vería así:

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); 

donde tiene muchos métodos visita que se distinguen por el tipo de sus parámetros

+0

entonces aquí puedes hacer algo como Admincontroller-> accept ($ visitor) y en el visitante tienes dos métodos, uno se llama visitAdmin y el otro se llama visitUser Y cuando no sabes el tipo de controlador que se debe visitar no es problema porque le das al controlador el visitante y él decide qué método de visitante llamar al – ITroubs

+0

También debes implementar una pequeña interfaz de visitante con solo el método accept y dejar que los dos controladores implementen esa interfaz para que puedas usar typehinting en tus métodos donde le das a tu controlador para que puedas estar seguro de que tienen ese método de aceptación – ITroubs

+0

¡Intentando jugar con este método! – Jeff

0

La herencia múltiple no es posible con PHP. Sin embargo, me pregunto, ¿por qué necesitarías dos controladores de inicio de sesión por separado? ¿Podría explicar lo que está haciendo en los controladores?

EDIT:
No estoy seguro si su código lo permite, pero podría tratar de poner todas las partes generales en el controlador del cliente y dejar que el controlador de administración se extienda desde este.

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

Bueno, tengo la lógica separada para conectar/regist depende de si el usuario está en la parte administrativa o del cliente del sitio web. Por ejemplo, si el usuario se está registrando en la parte de administración, proceso algunos campos de formulario más, o solicito un código de invitación, etc. También hay partes del inicio de sesión que son las mismas, como olvidar contraseña, restablecer, etc. – Jeff