withbody initialize cake beforerender php cakephp authorization url-routing separation-of-concerns

initialize - set cakephp



Mejores prácticas de CakePHP: administrador con o sin enrutamiento (5)

Estoy trabajando en una revisión de una aplicación CakePHP que construí en CakePHP 1.2. Me actualicé a 1.3 y estoy considerando alejarme del paradigma de enrutamiento de administrador para mi aplicación. Estoy descubriendo que algunos de mis controladores se están volviendo extremadamente grandes debido a las funciones duplicadas para la interfaz y el administrador. Mi intuición es que es mucho más limpio crear un conjunto de controladores de administración y soltar el enrutamiento de administrador todos juntos, pero quería obtener información sobre lo que otros están haciendo y qué funcionalidad, si es que hay alguna, me voy a perder. dejando caer el enrutamiento.

¿Cuáles son las mejores prácticas consideradas para una aplicación CakePHP robusta (u otro marco MVC) en este sentido?


He creado aplicaciones usando enrutamiento de administrador y no, y la versión no es siempre un desastre. si algunos de sus métodos son los mismos, puede hacer lo siguiente.

function add(){ $this->_add(); } function admin_add(){ $this->_add(); } function _add(){ ... your code ... }

apostaría que no es todo el código que es el mismo, y si no se utiliza el enrutamiento de administrador, terminarás con una gran cantidad de código if(... is admin ...) { echo ''blaa''} else { echo ''foo''; } if(... is admin ...) { echo ''blaa''} else { echo ''foo''; }


He usado ACL para mi aplicación y me parece mucho mejor que usar el enrutamiento de administrador. Es mucho más fácil. Si realmente quieres un prefijo, puedes hacerlo con un enrutamiento normal.


No te molestes con el enrutamiento de administrador si no se ajusta a tu situación. Tampoco lo estoy usando, las rutas de administrador no se ajustan a mi aplicación. El código de duplicación es un desperdicio de esfuerzo.

Puede usar las reglas de ACL para roles de granularidad fina, o simplemente verificar el rol (indicador de administración) en beforeFilter () del controlador o en la primera línea de una acción.

Tengo una función Componente checkRole (array ()), que se llama en la primera línea de mis acciones. Si el usuario actual no tiene las funciones proporcionadas, registra y finaliza la solicitud.


Utilizaría ACL / roles para cosas de administración real, y probablemente no usaría enrutamiento de administrador en producción. A veces conservo un enrutamiento de administrador andamiado (con un código adicional mínimo) para cosas de administración de bajo nivel, accesible solo para mí, pero probablemente no sea lo mejor en una aplicación de producción robusta.

Editar después del comentario: no es óptimo, pero es posible que pueda juntar algo que aparecerá como lo quiere en las direcciones URL y también se organizará en carpetas. No he podido probarlo todavía, pero esta es la idea:

Cree una carpeta "admin" en su carpeta de controladores y para el administrador de usuarios, cree un archivo de controlador users_admin_controller.php. Contraen la estructura de la carpeta, por lo que aún no puede tener los mismos nombres que su directorio raíz, pero aún puede separarlos en una carpeta.

Esto hará por defecto una situación de tipo /admin_users/add , pero puede modificarse con la segunda parte, alguna ruta:

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

Esto tendría que hacerse para cada sección de administrador, no es ideal, pero no puedo encontrar una forma mejor sin modificar el código de Cake.


Sugeriría que simplemente separe la aplicación front-end y el administrador en dos aplicaciones separadas ( /app y /admin ). Solo piense en admin como una aplicación de front-end simple, haciendo todo el trabajo "sucio" con la base de datos.

Al hacerlo, podrá acceder a su administrador utilizando el prefijo / admin en la URL o establecer DocumentRoot a / admin / webroot y acceder a admin utilizando el subdominio (es decir, admin.myapp.com).

Para evitar la duplicación del código del modelo, puede colocar los modelos en una carpeta compartida (es decir, /vendors/core/models ) y agregar esta ruta a las rutas del modelo en los archivos bootstrap.php ( App::build(''models'' => array(VENDORS . ''core/models/'')) para CakePHP 1.3, $modelPaths = array(VENDORS . ''core/models/'') para CakePHP 1.2).

Para agregar más elementos específicos del administrador o la aplicación a sus modelos, puede ampliar sus modelos principales en / modelos, cargando el modelo básico y ampliándolo:

App::import(''Model'', ''CoreModelName''); class CustomCoreModelA extends CoreModelA { function specificMethod() {} }

Eso podría hacerse para componentes compartidos, comportamientos, etc.