Extendiendo el controlador de cakephp
Este fin de semana el cake me hizo otra de las suyas. Aunque pensándolo bien siempre podemos disculparlo por trabajar en beta.
El caso es que yo necesitaba mi propio AppController para incluir una serie de acciones comunes a todas las peticiones, y que se ejecutarían en el beforeRender() (justo antes de renderizar la vista y después de ejecutar toda la lógica de los controladores).
Esto en cake 1.1 se hacía copiando el app_controller.php a la raíz de /app, sobreescribíamos los métodos necesarios y listo. Y claro antes de leer nada fue lo primero que hice en cake 1.2. Pero no tuve suerte. Resulta que no encontraba los métodos que estaba declarando. Cake no estaba cargando mi app_controller sino el por defecto en /cake/libs/controller.
De primeras acudí a google (no conozco otra forma mas rápida de encontrar solución a este tipo de problemas) y tras comprobar que era al único que le sucedía tal cosa me fuí directo a http://manual.cakephp.org/complete/3/the-manual y la sorpresa cuando me encuentro con estas líneas:
Both controllers, helpers and models have a parent class you can use to define application-wide changes. AppController (located at /app/app_controller.php), AppHelper (located at /app/app_helper.php) and AppModel (located at /app/app_model.php) are great places to put methods you want to share between all controllers, helpers or models.
Lo estaba haciendo bien!, tras navegar por el registro de bugs llegué a esta conversación en el grupo de google , que seria de mi sin la comunidad!, resulta que para extender el app_controller en cakephp 1.2 debes situarlo en /app/controllers/app_controller.php y no en /app/app_controllers.php.
No me quejo, es el riesgo que se corre por trabajar en betas, además, quitando estos dos detalles cake y yo nos llevamos bastante bien. Aunque eso si, prefiero no tener documentación a tener documentación mentirosa.















Hola Javi, pues lo que yo hice en tu caso que necesitaba hacer una herencia de una clase AppController en un controlador fué simplemente modificar la clase cake/app_controller.php
porque según leí vienen en blanco tanto esta clase como la clase cake/app_model.php que sean precisamente personalizadas por terceros
Hola Juan, mmm, creo que no es una buena idea modificar ninguna de las clases que forman parte del núcleo de cake, entre ellas cake/libs/controller/app_controller.php. Todo el código de nuestra aplicación debería estar en app y si incluyes un app/controllers/app_controller.php cake lo utilizará por defecto, al igual que app/models/app_model.php, creo que esta es el procedimiento ideal.
Imáginate por ejemplo una actualización de versión de cake, tendrías que estar preocupándote de todos los ficheros que habías actualizado en el nucleo /cake.
El motivo de que venga en blanco es simplemente de diseño, para abstraernos de toda la lógica del controller padre, nos creamos otro controller app_controller al que se llamará en última instancia, y claro esa clase debe existir si nosotros no la hemos utilizado en app/controller/.
jsanroman, viendo el tema del app_controller me surge la duda, cuando hablas de que lo incluiste en app/controllers/app_controller.php ¿como lo armaste? ¿lo definiste extendiendo a Controller o a AppController?.
En una aplicacion de ejemplo que me pasaron lo tengo en app/app_controller.php pero extiende a Controller directamente, seria algo asi:
class AppController extends Controller{
y lo toma bien en la ubicacion /app/app_controller.php
Gracias
Hola Agustín, si es como dices, revisa la documentación http://book.cakephp.org/view/829/The-App-Controller y lo tendrás mas claro.
Un saludo
En la versión 1.2.5 funciona tanto en app/ como en app/controllers