Foros del Web » Programando para Internet » PHP » Zend »

Problema con AutoLoader

Estas en el tema de Problema con AutoLoader en el foro de Zend en Foros del Web. Hola chicos, Llevo por lo menos una semana buscando en Internet. Pensé que mi problema sería una tontería (otras veces que he trabajado con ZF ...
  #1 (permalink)  
Antiguo 28/02/2012, 13:55
 
Fecha de Ingreso: abril-2007
Mensajes: 12
Antigüedad: 17 años
Puntos: 0
Pregunta Problema con AutoLoader

Hola chicos,

Llevo por lo menos una semana buscando en Internet. Pensé que mi problema sería una tontería (otras veces que he trabajado con ZF no me ha pasado) pero tras patearme todo google buscando la solución no he dado con la misma.

Estoy intentando hacer una base "CMS" en Zend para luego extenderla con más funcionalidades dependiendo del proyecto que tenga que desarrollar.

Estoy empezando por los usuarios y estoy intentando crear la "Admin". (Tengo el proyecto en [URL="https://github.com/topikito/zendcms"]GitHub[/URL] si lo quieren ver por ahí) Tengo la siguiente estructura:



En mi index lo siguiente:

Código PHP:
<?php

// Define path to application directory
defined('APPLICATION_PATH')
    || 
define('APPLICATION_PATH'realpath(dirname(__FILE__) . '/application'));

// Define application environment
defined('APPLICATION_ENV')
    || 
define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    
realpath(APPLICATION_PATH '/../library'),
    
get_include_path(),
)));

/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
    
APPLICATION_ENV,
    
APPLICATION_PATH '/configs/application.ini'
);
$application->bootstrap()
            ->
run();
En el Bootstrap:

Código PHP:
<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

    protected function 
_initAutoload() {
    
        
$autoloader = new Zend_Application_Module_Autoloader(array(
                    
'namespace' => 'Application',
                    
'basePath' => dirname(__FILE__),
                ));

    
//var_dump($autoloader);

        
return $autoloader;
    }

    protected function 
_initDoctype() {
        
$this->bootstrap('view');
        
$view $this->getResource('view');
        
$view->doctype('XHTML1_STRICT');
    }

}
Luego tengo la clase User en "models" que (no voy a copiarlo todo) empieza así:

Código PHP:
<?php

class Application_Model_User
{...}
Finalmente, el controlador del módulo "admin":
Código PHP:
<?php

//require APPLICATION_PATH.'/modules/default/models/User.php';

class Admin_UserController extends Zend_Controller_Action
{
    public function 
indexAction()
    {
        
$User = new Application_Model_User();
        
$this->view->entries $User->fetchAll();
    }
}
Sólo quiero hacer un fetchAll para ver que funciona. Si descomento el require en un par de sitios, funciona, pero esa no es la manera.

Obtengo el siguiente error:

Código:
2012/02/28 20:46:47 [error] 12171#0: *193 FastCGI sent in stderr: "PHP Fatal error:  Class 'Application_Model_User' not found in /mnt/www-host/ZendCMS/application/modules/admin/controllers/UserController.php on line 9
PHP Stack trace:
PHP   1. {main}() /mnt/www-host/ZendCMS/index.php:0
PHP   2. Zend_Application->run() /mnt/www-host/ZendCMS/index.php:26
PHP   3. Zend_Application_Bootstrap_Bootstrap->run() /mnt/www-host/ZendCMS/library/Zend/Application.php:366
PHP   4. Zend_Controller_Front->dispatch() /mnt/www-host/ZendCMS/library/Zend/Application/Bootstrap/Bootstrap.php:97
PHP   5. Zend_Controller_Dispatcher_Standard->dispatch() /mnt/www-host/ZendCMS/library/Zend/Controller/Front.php:954
PHP   6. Zend_Controller_Action->dispatch() /mnt/www-host/ZendCMS/library/Zend/Controller/Dispatcher/Standard.php:295
PHP   7. Admin_UserController->indexAction() /mnt/www-host/ZendCMS/library/Zend/Controller/Action.php:513" while reading upstream, client: 192.168.1.128, server: zendcms.loc, request: "GET /admin/user HTTP/1.1", upstream: "fastcgi://unix:/tmp/php5-fpm.sock:", host: "www.zendcms.loc"
Por si sirve de algo, he hecho un var_dump del $autoloader:

Código PHP:
object(Zend_Application_Module_Autoloader)[12]
  protected 
'_basePath' => string '/mnt/www-host/ZendCMS/application' (length=33)
  protected 
'_components' => 
    array
      
'Application_Model_DbTable' => string '/mnt/www-host/ZendCMS/application/models/DbTable' (length=48)
      
'Application_Model_Mapper' => string '/mnt/www-host/ZendCMS/application/models/mappers' (length=48)
      
'Application_Form' => string '/mnt/www-host/ZendCMS/application/forms' (length=39)
      
'Application_Model' => string '/mnt/www-host/ZendCMS/application/models' (length=40)
      
'Application_Plugin' => string '/mnt/www-host/ZendCMS/application/plugins' (length=41)
      
'Application_Service' => string '/mnt/www-host/ZendCMS/application/services' (length=42)
      
'Application_View_Helper' => string '/mnt/www-host/ZendCMS/application/views/helpers' (length=47)
      
'Application_View_Filter' => string '/mnt/www-host/ZendCMS/application/views/filters' (length=47)
  protected 
'_defaultResourceType' => string 'model' (length=5)
  protected 
'_namespace' => string 'Application' (length=11)
  protected 
'_resourceTypes' => 
    array
      
'dbtable' => 
        array
          
'namespace' => string 'Application_Model_DbTable' (length=25)
          
'path' => string '/mnt/www-host/ZendCMS/application/models/DbTable' (length=48)
      
'mappers' => 
        array
          
'namespace' => string 'Application_Model_Mapper' (length=24)
          
'path' => string '/mnt/www-host/ZendCMS/application/models/mappers' (length=48)
      
'form' => 
        array
          
'namespace' => string 'Application_Form' (length=16)
          
'path' => string '/mnt/www-host/ZendCMS/application/forms' (length=39)
      
'model' => 
        array
          
'namespace' => string 'Application_Model' (length=17)
          
'path' => string '/mnt/www-host/ZendCMS/application/models' (length=40)
      
'plugin' => 
        array
          
'namespace' => string 'Application_Plugin' (length=18)
          
'path' => string '/mnt/www-host/ZendCMS/application/plugins' (length=41)
      
'service' => 
        array
          
'namespace' => string 'Application_Service' (length=19)
          
'path' => string '/mnt/www-host/ZendCMS/application/services' (length=42)
      
'viewhelper' => 
        array
          
'namespace' => string 'Application_View_Helper' (length=23)
          
'path' => string '/mnt/www-host/ZendCMS/application/views/helpers' (length=47)
      
'viewfilter' => 
        array
          
'namespace' => string 'Application_View_Filter' (length=23)
          
'path' => string '/mnt/www-host/ZendCMS/application/views/filters' (length=47
No veo donde estoy fallando y he probado de todo. Alguien tiene alguna idea de qué puede ser?
  #2 (permalink)  
Antiguo 28/02/2012, 14:12
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Problema con AutoLoader

1.- No debes de poner el autoloader en el Bootstrap, basta con que pongas en tu application.ini la siguiente linea:
Código:
appnamespace = "Application"
2.- Una vez con ese cambio y sin el Autoloader en el Bootstrap debes de poder cargar la clase sin problemas.

Saludos.
  #3 (permalink)  
Antiguo 28/02/2012, 14:34
 
Fecha de Ingreso: abril-2007
Mensajes: 12
Antigüedad: 17 años
Puntos: 0
Respuesta: Problema con AutoLoader

Gracias Gator por la respuesta.

Me olvidé de poner el Application.ini:

Código:
[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"

;resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" 
resources.frontcontroller.defaultmodule = "default"

resources.frontController.params.displayExceptions = 0
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
resources.view[] =
resources.modules[] = ""


resources.db.adapter = "PDO_MYSQL"
resources.db.params.host = "localhost"
resources.db.params.username = "root"
resources.db.params.password = ""
resources.db.params.dbname = "zendcms"

[staging : production]



[testing : production]
resources.frontController.params.displayExceptions = 1
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

resources.db.adapter = "PDO_MYSQL"
resources.db.params.host = "localhost"
resources.db.params.username = "root"
resources.db.params.password = ""
resources.db.params.dbname = "zendcms"

[development : production]
resources.frontController.params.displayExceptions = 1
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

resources.db.adapter = "PDO_MYSQL"
resources.db.params.host = "localhost"
resources.db.params.username = "root"
resources.db.params.password = ""
resources.db.params.dbname = "zendcms"

Ya tenía esa línea. Si borro el método del _initAutoLoad obtengo lo siguiente:

Código:
2012/02/28 21:28:45 [error] 12171#0: *218 FastCGI sent in stderr: "PHP Fatal error:  Uncaught exception 'Zend_Application_Bootstrap_Exception' with message 'No default controller directory registered with front controller' in /mnt/www-host/ZendCMS/library/Zend/Application/Bootstrap/Bootstrap.php:91
Stack trace:
#0 /mnt/www-host/ZendCMS/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#1 /mnt/www-host/ZendCMS/index.php(26): Zend_Application->run()
#2 {main}
  thrown in /mnt/www-host/ZendCMS/library/Zend/Application/Bootstrap/Bootstrap.php on line 91" while reading response header from upstream, client: 192.168.1.128, server: zendcms.loc, request: "GET /admin/user HTTP/1.1", upstream: "fastcgi://unix:/tmp/php5-fpm.sock:", host: "www.zendcms.loc"
2012/02/28 21:28:46 [error] 12171#0: *218 FastCGI sent in stderr: "PHP Fatal error:  Uncaught exception 'Zend_Application_Bootstrap_Exception' with message 'No default controller directory registered with front controller' in /mnt/www-host/ZendCMS/library/Zend/Application/Bootstrap/Bootstrap.php:91
Stack trace:
#0 /mnt/www-host/ZendCMS/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#1 /mnt/www-host/ZendCMS/index.php(26): Zend_Application->run()
#2 {main}
  thrown in /mnt/www-host/ZendCMS/library/Zend/Application/Bootstrap/Bootstrap.php on line 91" while reading response header from upstream, client: 192.168.1.128, server: zendcms.loc, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://unix:/tmp/php5-fpm.sock:", host: "www.zendcms.loc"
  #4 (permalink)  
Antiguo 28/02/2012, 14:54
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Problema con AutoLoader

Ese error es por tener comentada la clave resources.frontController.controllerDirectory

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 28/02/2012, 15:45
 
Fecha de Ingreso: abril-2007
Mensajes: 12
Antigüedad: 17 años
Puntos: 0
Respuesta: Problema con AutoLoader

Hola Masterpuppet,

He descomentado la clave y sigo obteniendo el mismo error. Igualmente, creo que al usar módulos, no tengo una carpeta única de controladores ya que cada módulo tiene la suya, no?


El orden de las cosas en el application.ini no es relevante, no?

Última edición por topikito; 28/02/2012 a las 16:02
  #6 (permalink)  
Antiguo 28/02/2012, 16:14
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Problema con AutoLoader

Por lo general el orden no importa. pero estas lineas deben estar en este orden(en tu caso esta bien, es solo para que lo tengas en cuenta)

Código INI:
Ver original
  1. resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
  2. resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"

y creo que el problema es un typo:

Código INI:
Ver original
  1. resources.frontcontroller.defaultmodule = "default"

debe ser

Código INI:
Ver original
  1. resources.frontController.defaultModule = "default"

la c de controller en mayúsculas, la m de module creo que no importa pero es mejor dejarlo como debe ser, prueba y nos comentas.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #7 (permalink)  
Antiguo 28/02/2012, 16:29
 
Fecha de Ingreso: abril-2007
Mensajes: 12
Antigüedad: 17 años
Puntos: 0
Respuesta: Problema con AutoLoader

Correcto, antes lo tenía bien pero siguiendo "consejos" de internet copié y pegué y quedó mal. Volví a hacerlo como dices, y descomento la línea del controller. Ahora el error es el inicial:

Código:
( ! ) Fatal error: Class 'Application_Model_User' not found in /mnt/www-host/ZendCMS/application/modules/admin/controllers/UserController.php on line 9
He reestructurado el INI:

Código:
[production]
;;ERROR STUFF
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

;;BASIC CONFIG
appnamespace = "Application"
includePaths.library = APPLICATION_PATH "/../library"
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"

;;MODULE CONFIG
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" 
resources.frontController.defaultModule = "default"
resources.view[] =
resources.modules[] = 

;;DATABASE CONFIG
resources.db.adapter = "PDO_MYSQL"
resources.db.params.host = "localhost"
resources.db.params.username = "root"
resources.db.params.password = ""
resources.db.params.dbname = "zendcms"

[staging : production]

[testing : production]

[development : production]
  #8 (permalink)  
Antiguo 28/02/2012, 16:50
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Problema con AutoLoader

Estas seguro que ese es el error ?, porque yo veo un par de errores en tu git pero debería funcionar, te comento los errores.
  1. Tienes el index.php a la altura de application, grave error
  2. Porque tienes el mapper dentro del Model ? debería estar en su namespace Application\Model\Mapper
  3. Dentro del mapper tienes hardcodeado el nombre del dbtable, tiene un typo, debería ser Application_Model_DbTable_Users

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #9 (permalink)  
Antiguo 28/02/2012, 16:58
 
Fecha de Ingreso: abril-2007
Mensajes: 12
Antigüedad: 17 años
Puntos: 0
Respuesta: Problema con AutoLoader

El application está al mismo nivel que el index por que no en todos los hostings puedes acceder desde el nivel del index.php a un nivel inferior.
El Mapper dentro del Model no es un error, es como viene en el QuickStart de Zend, más adelante lo tenía pensado sacar. Igualmente, si se hace un require de dicho fichero, cargará las dos clases, luego eso no debería ser un problema.
Sobre el DbTable, tienes razón, gracias. No obstante, el error peta antes.
  #10 (permalink)  
Antiguo 28/02/2012, 17:20
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Problema con AutoLoader

Cita:
El application está al mismo nivel que el index por que no en todos los hostings puedes acceder desde el nivel del index.php a un nivel inferior.
Zend no es un fw para cualquier hosting, tenerlo a la misma altura no es una buena idea.
Cita:
El Mapper dentro del Model no es un error, es como viene en el QuickStart de Zend, más adelante lo tenía pensado sacar. Igualmente, si se hace un require de dicho fichero, cargará las dos clases, luego eso no debería ser un problema.
Que este de esa forma en el qs no quiere decir que este bien, de echo no esta bien, va en realidad el qs en su totalidad no es la gran cosa deja bastante que desear.
Cita:
Sobre el DbTable, tienes razón, gracias. No obstante, el error peta antes.
Es raro, acabo de clonar el proyecto, me salto el error del dbtable, lo cambie por el nombre correcto y funciona sin problemas el autoloader, podrias comprobar los permisos.
Y te comento que me tiro un error en el view del user en el admin, no estan bien las carpetas, tienes scripts/admin/user y deberia ser scripts/user, tambien hay un error en el modelo User, en el metodo fetchAll la variable $users deberia ser $entries.



Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #11 (permalink)  
Antiguo 28/02/2012, 17:45
 
Fecha de Ingreso: abril-2007
Mensajes: 12
Antigüedad: 17 años
Puntos: 0
Respuesta: Problema con AutoLoader

Nos desviamos del tema. Probaré eso que dices de los permisos. Gracias por la ayuda masterpuppet
  #12 (permalink)  
Antiguo 28/02/2012, 23:13
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Problema con AutoLoader

La mayoría de los hostings deben de permitir usar Zend, a lo mejor te refieres a las subcarpetas por lo que este tutorial te puede servir:

http://www.forosdelweb.com/f68/confi...abajar-918099/
  #13 (permalink)  
Antiguo 29/02/2012, 01:07
 
Fecha de Ingreso: abril-2007
Mensajes: 12
Antigüedad: 17 años
Puntos: 0
Respuesta: Problema con AutoLoader

Gracias chicos, ya descubrí lo que era.

Intenté cambiar los permisos pero obtuve lo siguiente:

Código:
root@www-dev:/mnt/www-host/ZendCMS# chmod -R 755 ./
chmod: no se puede acceder a «./application/models»: No existe el archivo o el directorio
chmod: no se puede acceder a «./application/modules/admin/Bootstrap.php»: No existe el archivo o el directorio
chmod: no se puede acceder a «./application/modules/default/Bootstrap.php»: No existe el archivo o el directorio
root@www-dev:/mnt/www-host/ZendCMS# cd application/mod      //Doble tab para ver qué había
models   modules/ 
root@www-dev:/mnt/www-host/ZendCMS# cd application/models 
bash: cd: application/models: No existe el archivo o el directorio
Reinicié la máquina y ya funcionó. Rarísimo!

Gracias por la ayuda y por los consejos, indagaré lo del applications aunque no lo veo como algo necesario para el buen funcionamiento del FW.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:00.