2010-01-19 4 views
0

Je suis nouveau cadre zend alors peut-être cette question est stupide ..Zend Framework classes de autoloading étendues par des modèles

J'ai une hiérarchie par défaut

Site
| --bootstrap.php
| --application
| --Modèles
      | - item.php
      | - ModelAbstract.php
| --...

intérieur item.php il y a

<?php 
    //TODO: trying to remove this require... 
    require_once('ModelAbstract.php'); 

    class CF_Model_Flower extends CF_Model_Abstract 
    { 
     ... 

il y a

<?php 

    class CF_Model_Abstract 
    { 
    ... 

Et ma demande Inside 'ModelAbstract.php' Bootstrap. php ressemble à

<?php 

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
    protected function _initAutoload() 
    { 
     $autoloader = new Zend_Application_Module_Autoloader(array(
      'namespace' => 'CF', 
      'basePath' => dirname(__FILE__), 
     )); 
     return $autoloader; 
    } 
    ... 

Si j'ai supprimé le 'require_once' à l'intérieur .php Je reçois

Fatal error: Class 'CF_Model_Abstract' not found in /Mysite/application/models/Item.php on line 6 

Pourquoi? Et comment puis-je utiliser autoloading pour vivre sans cela require_once? En fait, le fait de renommer 'ModelAbstract.php' en 'Abstract.php' fonctionne. Quelqu'un peut-il m'expliquer pourquoi?

Thx

Répondre

0

Je ne suis pas familier avec Zend_Application_Module_Autoloader et tel. Mais si elles fonctionnent tout comme les mécanismes ZF de chargement automatique plus tôt, le chargeur automatique recherchera la classe CF_Model_Abstract dans:

CF/Model/Abstract.php

ou peut-être avec cet espace de noms/configuration basePath dans:

models/Model/Abstract.php

ou:

models/CF/Model/Abstract.php

bu t probablement pas:

models/ModelAbstract.php

En d'autres termes, les underscores représentent les répertoires enfants. Essayez de spécifier le _ dans l'espace de noms.

+0

Vous m'avez donné un indice sérieux, je viens de renommer 'ModelAbstract.php' en 'Abstract.php' et ça a marché! Je n'arrive pas à comprendre pourquoi: -/ Je pensais que les espaces de noms utilisés pour préfixer les classes Zend_Application_Module_Autoloader vérifiaient à partir de 'basePath' certaines ressources par défaut, ie dans le répertoire 'models' il chercherait des classes comme "CF_Model_XXX". Je pensais que les noms de fichiers n'avaient aucun sens dans ce cas. –

0

$autoloader = new Zend_Application_Module_Autoloader(array(
      'namespace' => 'CF_', 
      'basePath' => dirname(__FILE__), 
)); 
+0

Ça ne marche pas :( –

0

Mettez ce qui suit dans votre fichier d'amorçage:

protected function _initAutoLoad() 
{ 
    $loader = new Zend_Loader_Autoloader_Resource(array(
     'basePath' => APPLICATION_PATH, 
     'namespace' => 'CF', 
    )); 

    $loader->addResourceType('form', 'forms', 'Form') 
     ->addResourceType('model', 'models', 'Model') 
     ->addResourceType('mapper', 'models/mappers', 'Model_Mapper') 
     ->addResourceType('dbtable', 'models/DbTable', 'Model_DbTable'); 
    return $loader; 
} 

Ceci charge les modèles, formes, DBTables et cartographes pour vous. J'espère que cela fait l'affaire.

Questions connexes