2009-12-09 16 views
6

Me preguntaba si de alguna manera es posible agregar otro controlador de abstracción entre AppController y otros controladores de mi aplicación.Cakephp: ¿Resumiendo AppController otro nivel, posible?

Para que mis controladores, p. UsersController extiende SecureController y SecureController extiende AppController.

También deseo poder tener otros controladores para extender AppController directamente: SomeNonSecureController extiende AppController.

esto es porque mi AppController actual tiene todo tipo de elementos Auth y ACL en su beforeFilter, pero también tengo controladores que no necesitan esa seguridad (antes de que todo necesitara la seguridad, no se han agregado nuevas especificaciones). . pero debido a que muchos controladores lo necesitan, no tiene sentido copiar y pegar el código a todos los controladores necesitados.

Estaba pensando en todas las cosas de seguridad de beforeFilter en un SecureController, de esta forma los controladores que necesitan seguridad lo extienden, mientras que otros heredan de AppController directamente.

¿Cómo harías para hacer algo como esto?

Gracias de antemano, Ken.

Respuesta

6

Lo primero que pensé fue ver si podía abstraer parte de la funcionalidad de beforeFilter en un componente; recuerde que los componentes también pueden usar otros componentes, simplemente instálelos en la propiedad $ components de su componente para que pueda acceder al AuthComponent y AclComponent etc.

Si esto no era adecuado a continuación, me gustaría ir a la ruta, con el fin de hacerlo, basta con incluir ('secure_controller.php'); antes de su declaración de clase de controlador individual en su archivo.

He hecho algo similar al crear un BaseController que uso en todos mis proyectos que proporciona todas mis acciones CRUD de administrador que son estándar. Luego hago que mi AppController amplíe esto, que contiene una amplia funcionalidad de controladores específicos de la aplicación, luego los controladores individuales lo extienden y terminan prácticamente vacíos. Todo lo que hago es:

// app/base_controller.php 
<?php class BaseController extends Controller {} ?> 

// app/app_controller.php 
<?php 
include('base_controller.php'); 
class AppController extends BaseController {} 
?> 

// app/controllers/my_controller.php 
<?php class MyController extends AppController {} ?> 
+0

aquí es mi problema, lo que necesito para construir una aplicación que está tiene 2 webroots: uno/admin, y uno/pro pero necesitan estar compartiendo la misma carpeta/app para modelos y tal. ahora todo en/admin necesita ser seguro con Auth y ACL, mientras que/pro no necesita ser (esperar unos pocos controladores). ¿Cómo sugerirías que vayas a hacer esto? Por cierto, soy Ken de los comentarios en su blog de la ACL :) gracias por la respuesta! – Ken

+0

Hmmm, probablemente actualizaría a 1.3 y luego usar Enrutamiento.prefijos para manejar los diferentes prefijos de URL y seguir utilizando los mismos modelos y controladores para todas las áreas. A continuación, utilice la propiedad AuthComponent :: allowedActions para cambiar qué acciones requieren autorización. ¿O me he perdido el punto? – neilcrookes

+0

Bueno, eso podría funcionar (no sé nada sobre enrutamiento.prefixes en realidad) - pero 1.3 todavía está en alfa, y esta es una aplicación para uso de producción, así que no puedo arriesgarme. necesita encontrar una solución 1.2.5: - \ – Ken

1

Acabo de intentar esto también. Parece que es relativamente simple extender cualquier controlador con cualquier otro. En Cake 2.0 solo usas la declaración import() (include() hace algo similar).

App::import('Controller', 'Security'); 
class SecureAreaController extends SecurityController { 
    // extra functionality *not* in base class goes here 
} 
+1

App :: import funciona al menos desde Cake 1.2 –

+0

En realidad ... creo que 'App :: uses ('SecurityController', 'Controller')' es en realidad la forma correcta de hacerlo (al menos, como Cake lo hace en su lib). Sin embargo, no estoy seguro de la diferencia. –

+0

Además, mis experimentos recientes parecen mostrar que esta estructura de herencia funciona razonablemente bien, excepto por las variables de clase tales como '$ helpers',' $ components' etc. que en realidad * se reemplazan * en clases secundarias y no se combinan porque Cake tiende a hacer con AppController. * Puedes * cambiar el '$ _mergeParent' pero la mejor opción es cambiar tu clase padre (el hijo de AppController) para agregar/fusionar los ayudantes y componentes dentro de' __construct() '. –