IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend Framework PHP Discussion :

Autoloader entre controller de modules differents


Sujet :

Zend Framework PHP

  1. #1
    Membre confirmé
    Profil pro
    None
    Inscrit en
    Mars 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : None

    Informations forums :
    Inscription : Mars 2008
    Messages : 58
    Par défaut Autoloader entre controller de modules differents
    Bonjour.
    Mon application a 3 modules. Sur certaines fonctionnalités, ils sont très semblables. Du coup, j'en ai créé un 4e, sobrement appelé default.
    Le principe serait que dans chaque module, certains controllers étendent ceux du module default, afin de ne pas dupliquer le code.
    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class Sports_BlocController extends Default_BlocController
    dans le fichier application/modules/sports/controllers/BlocController.php

    Pb: l'autoloading sur le Default_BlocController ne se fait pas.

    configuration de mon application (n'est copiée que la partie relative à mon pb):
    application/config/main.ini
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Autoloadernamespaces[] = "Zend_"
    Autoloadernamespaces[] = "My_"
    bootstrap.path = APPLICATION_PATH "/bootstrap/Bootstrap.php"
    resources.modules[]=
    application/bootstrap/Bootstrap.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	protected function _initDefaultModuleAutoloader() {
    		$this->_resourceLoader = new Zend_Application_Module_Autoloader(
    			array(
    				'namespace' => 'Default',
    				'basePath' => APPLICATION_PATH.'/modules/default'
    			)
    		);
    		return $this->_resourceLoader;
    	}
    application/modules/default/Bootstrap.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class Default_Bootstrap extends Zend_Application_Module_Bootstrap
    {
    }
    application/modules/sports/Bootstrap.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class Sports_Bootstrap extends Zend_Application_Module_Bootstrap
    {
    }
    Merci d'avance pour votre aide.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Ingenieur BI - Dev Web Senior
    Inscrit en
    Décembre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingenieur BI - Dev Web Senior

    Informations forums :
    Inscription : Décembre 2009
    Messages : 118
    Par défaut
    Bonjour danidan75,

    C'est quoi le message d'erreur Zend ?
    Si je comprends bien, tu as l'erreur que quand tu accède, via browser, au module "Sports" ?

  3. #3
    Membre confirmé
    Profil pro
    None
    Inscrit en
    Mars 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : None

    Informations forums :
    Inscription : Mars 2008
    Messages : 58
    Par défaut
    Fatal error: Class 'Default_BlocController' not found in C:\www\site\application\modules\sports\controllers\BlocController.php on line 4
    Et le problème se produit pour tous les modules (excepte, bien sur, default)

  4. #4
    Membre éprouvé
    Homme Profil pro
    Ingenieur BI - Dev Web Senior
    Inscrit en
    Décembre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingenieur BI - Dev Web Senior

    Informations forums :
    Inscription : Décembre 2009
    Messages : 118
    Par défaut
    @danidan75,

    Essaye ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    protected function _initDefaultModuleAutoloader() {
    	$moduleLoader = new Zend_Application_Module_Autoloader(array(
    		'namespace' => 'Default',
    		'basePath' => APPLICATION_PATH . '/modules/default'
    	));
     
    	$this->bootstrap('frontController');
    	$front = $this->frontController;
     
    	$modules = $front->getControllerDirectory();
    	$default = $front->getDefaultModule();
     
    	foreach (array_keys($modules) as $module) {
    		if ($module === $default) {
    			continue;
    		}
    		$autoLoader->pushAutoloader(new Zend_Application_Module_Autoloader(array(
    			'namespace' => ucwords($module),
    			'basePath' => $front->getModuleDirectory($module),
    		)));
    	}
    }

  5. #5
    Membre confirmé
    Profil pro
    None
    Inscrit en
    Mars 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : None

    Informations forums :
    Inscription : Mars 2008
    Messages : 58
    Par défaut
    J'ai légèrement adapté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $autoLoader->pushAutoloader
    devenant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Zend_Loader_Autoloader::getinstance()->pushAutoloader
    , mais le message d'erreur reste le même.
    De plus, je pense que le code que vous m'avez proposé fait exactement l'inverse de ce que je voudrais: je souhaite que les controllers du module "default" soient accessible, via l'autoloading, par tous les autres.
    En fait, l'équivalent d'un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    protected function _initDefaultModuleAutoloader() {
    	$moduleLoader = new Zend_Application_Module_Autoloader(array(
    		'namespace' => 'Default',
    		'basePath' => APPLICATION_PATH . '/modules/default'
    	));
    	$moduleLoader->addResourceTypes(array(
    		'controller' => array(
    			'path' => 'controllers',
    			'namespace' => ''
    		)
    	));
    }
    Ainsi, Default_BlocController pointerait sur APPLICATION_PATH . '/modules/default/controllers/BlocController.php'. Mais la chaine vide étant interdite pour le namespace, ça bloque.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Ingenieur BI - Dev Web Senior
    Inscrit en
    Décembre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingenieur BI - Dev Web Senior

    Informations forums :
    Inscription : Décembre 2009
    Messages : 118
    Par défaut Créer un controller commun dans ta propre librairie
    @danidan75,

    Je te conseil de créer un autre controller commun dans le répertoire "My" et que lui hérite de Zend_Controller_Action.
    Ce controller contiendra les fonctions communes et tu fais hériter tes controllers dans tes modules de ce dernier.

    Qu'est-ce que tu en pense ?

  7. #7
    Membre confirmé
    Profil pro
    None
    Inscrit en
    Mars 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : None

    Informations forums :
    Inscription : Mars 2008
    Messages : 58
    Par défaut
    J'y avais pensé, mais estimais qu'un controller n'avait rien à faire dans mes librairies, fut-il un abstract controller.
    Au final, je prends la solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $this->_resourceLoader->addResourceTypes(array(
    	'controller' => array(
    		'path' => 'controllers',
    		'namespace' => 'Base'
    	)
    ));
    Mes controllers de base se nommeront Default_Base_BlocController, Default_Base_WhateverController, ... ce qui me permettra de laisser mes fichiers à l'endroit où ils sont censés se trouver: dans leur module. Et de définir des vues par défaut associées au controllers sus-mentionnés, bref un site par défaut auquel les 3 autres modules se référeront fréquemment.
    La solution apportée n'est pas géniale, mais me semble être la moins crade.
    Si qq'un en a une correspondant à ce que je voulais au début, qu'il n'hésite pas à se manifester.

    @abenlahsen: merci bcp pour votre aide

  8. #8
    Invité
    Invité(e)
    Par défaut
    Pour mon projet j'ai eu besoin d'étendre des classes communes.
    Mes classes parent sont des abstract.

    Je l'ai ait placer dans le dossier /application/controllers/

    dans application.ini : autoloaderNamespaces.extension[] = "controllers_"
    et dans l'indes.php du repertoire public j'ai ajouté au set_include_path : "realpath(APPLICATION_PATH ),"


    j'espère que ca pourra t'aider.

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/01/2008, 19h15
  2. Probleme controle et module
    Par ptitom1381 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 16/01/2007, 16h29
  3. [VB.NET] comment docker avec des marges entre controles ?
    Par lacsap49 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 08/11/2006, 16h59
  4. Ne comprends pas la liaison entre requete et module
    Par joker vb dans le forum Access
    Réponses: 4
    Dernier message: 01/02/2006, 23h25
  5. [VB]Gérer la liaison entre controle utilisateur et form
    Par Ooly2001 dans le forum VB 6 et antérieur
    Réponses: 19
    Dernier message: 23/01/2006, 09h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo