Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
J'ai utilisé les Zend_Tools pour générer l'arborescence et les fichiers de base. Puis, pour que les Models, Forms, etc. soient directement instanciables, j'ai dû ajouter dans le application/Bootstrap.php ceci :
protected function _initAutoload() { new Zend_Application_Module_Autoloader(array('namespace' => '', 'basePath' => APPLICATION_PATH)); }
Maintenant, si j'ai un fichier ./application/models/Movies.php avec une class Model_Movies définie dedans, j'ai la possibilité dans le controleur de l'instancier directement. De là même façon, la class Form_Login extends Zend_Form contenue dans application/forms/Login.php est maintenant directement instanciable depuis n'importe quel controleur.
Jusque là aucun soucis. Le problème, c'est que la classe Model_Movies est en fait une class Model_Movies extends Zend_Db_Table_Abstract de façon à pouvoir faire ce genre de chose dans le controleur :
$model = new Model_Movies; $data = $model->fetchAll();
Tout marche bien sauf si je veux faire des liens entre les tables. Apparemment le nom "Model_Movies" ne se prête pas à ce genre de manip. J'ai une table movies et une table categories. Je crée donc les deux modèles suivant :
Dans application/models/Categories.php :
class Model_Categories extends Zend_Db_Table_Abstract { protected $_name = 'categories'; protected $_primary = array('id'); }
Et dans application/models/Movies.php :
class Model_Movies extends Zend_Db_Table_Abstract { protected $_name = 'movies'; protected $_primary = array('id'); protected $_referenceMap = Array ( 'Category' => Array ( 'columns' => Array('cat_id'), 'refTableClass' => 'Model_Categories', 'refColumns' => Array('id') ) ); }
De cette façon je cherche à pouvoir obtenir le nom de la catégorie en fonction de l'id de la vidéo. Mais évidemment ça ne marche pas : au moment de "join" les tables, Zend ne parvient pas à instancier de class "Categories".
La question est donc : est-ce que le schéma d'autoload que j'utilise est la « bonne » manière de procéder ? Car dans tous les exemples de Zend Framework, le nom des Models de tables n'est pas préfixé par "Model". Quelle est donc la config attendue dans le public/index.php et/ou Bootstrap.php ?
Je trouve la doc très évasive sur ce sujet, pourtant, tous les exemples semblent baser sur un modèle de chargement/autoload standard... que je n'ai pas trouvé.
Merci.
Hors ligne
Si quelqu'un à une idée de comment se débarrasser du préfixe Model_ devant les models, je suis aussi preneur.
$resourceLoader = new Zend_Loader_Autoloader_Resource(array( 'basePath' => 'path/to/some/directory', 'namespace' => 'My', )); $resourceLoader->addResourceType('acl', 'acls/', 'Acl') ->addResourceType('form', 'forms/', 'Form') ->addResourceType('model', 'models/');
Source : http://framework.zend.com/manual/fr/zen … ource.html
C'est moi ou cet exemple n'est pas fonctionnel ?
Moi il me met une exception comme quoi il attend un namespace pour la "ressourceType" model.
Je suis un peu déçu de devoir de trimbaler mes "Model_News", "Model_Personne"
C'est pas très pratique.
Merci
Hors ligne
Je ne suis pas sur, mais si tu définis un type de resource par défaut, tu peux eventuellement omettre le model quand tu instancies tes models, mais pas dans leur déclaration
$this->setDefaultResourceType('model');
Hors ligne
Chez moi ça ne marche pas en tout cas...
Par contre, j'ai trouvé quelque chose qui permet de revenir à un comportement plus rustre de l'autoloader :
$autoloader->setFallbackAutoloader(true);
Par contre ça oblige à mettre le répertoire "models" dans l'include path.
Hors ligne
Pages: 1