Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 12-05-2011 15:21:31

moip
Membre
Date d'inscription: 10-05-2011
Messages: 13

Probléme controler No default controller directory

Bonjour,

Je galère un peu avec le bootstrap et mes controllers.
Mon erreur que j'arrive pas résoudre je ne sais pourquoi :


Fatal error: Uncaught exception 'Zend_Application_Bootstrap_Exception' with message 'No default controller directory registered with front controller' in /Applications/MAMP/htdocs/***/library/Zend/Application/Bootstrap/Bootstrap.php:71 Stack trace: #0 /Applications/MAMP/htdocs/***/application/Bootstrap.php(16): Zend_Application_Bootstrap_Bootstrap->run() #1 /Applications/MAMP/htdocs/***/library/Zend/Application.php(328): Bootstrap->run() #2 /Applications/MAMP/htdocs/***/www/index.php(26): Zend_Application->run() #3 {main} thrown in /Applications/MAMP/htdocs/***/library/Zend/Application/Bootstrap/Bootstrap.php on line 71

Voici mon arborescence
application
   configs
        application.ini
   forms
   controller
   modules
      Frontend
          controllers
               IndexController.php
          views
               scripts
                    index
                         index.phtml
      Backend
bootstrap.php

Mon bootstrap :

Code:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{

    //Initialize Module
    protected function _initAutoload()
    {
        $loader = new Zend_Application_Module_Autoloader(array(
            'namespace' => '',
            'basePath'  => APP_PATH));
        return $loader;
    }

    public function run()
    {
        // Cela permet d'avoir le fichier de configuration disponible depuis n'importe ou dans l'application.
        Zend_Registry::set('config', new Zend_Config($this->getOptions()));
        parent::run();
    }

}

Mon fichier .ini pour mon controllers :

Code:

[production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
includePaths.library = APP_PATH "/library"

appnamespace = "Application"
bootstrap.path = APP_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"

#initialize front controller resource
resources.frontcontroller.throwExceptions = 1
resources.frontController.moduleDirectory = APP_PATH "/modules"
resources.frontController.defaultControllerName = "index"
resources.frontController.defaultAction = "index"
resources.frontController.defaultModule = "Frontend"

Je consultais beaucoup de forums, je n'arrive pas à trouver de solution Merci d'avance

Hors ligne

 

#2 12-05-2011 15:35:52

nuxwin
Membre
Lieu: Caen (14)
Date d'inscription: 17-03-2011
Messages: 66

Re: Probléme controler No default controller directory

Bonjour ;

Je connais déjà la source de votre problème mais avant de vous répondre, j'aimerais avoir quelque informations supplémentaires.

Votre contrôleur par défaut se trouve où exactement ?

dans:

Code:

application/controllers

ou dans :

Code:

application/modules/XXXXX/controllers

Notez qu'avec une architecture modulaire comme la votre, il est possible de supprimer les répertoires:

Code:

/application/controllers
/application/forms

et de n'utiliser que les modules
....

Dernière modification par nuxwin (12-05-2011 16:33:17)

Hors ligne

 

#3 12-05-2011 15:38:35

moip
Membre
Date d'inscription: 10-05-2011
Messages: 13

Re: Probléme controler No default controller directory

Merci pour les conseils.

Mon controller par défaut ce trouve dans application/modules/XXXXX/controllers ?

Dernière modification par moip (12-05-2011 15:50:31)

Hors ligne

 

#4 12-05-2011 15:54:08

nuxwin
Membre
Lieu: Caen (14)
Date d'inscription: 17-03-2011
Messages: 66

Re: Probléme controler No default controller directory

Re ;

Dans ce cas, je pense que votre souhait est de n'utiliser que des modules.

Je pars donc du principe qu'au final votre architecture va ressembler à celle-ci:

Code:

application
   configs
        application.ini
   modules
      Frontend
          controllers/
          views/
          models/
          forms/
          Bootstrap.php
      Backend
          controllers/
          views/
          models/
          forms/
          Bootstrap.php
      bootstrap.php

Ainsi donc, pour commencer, dans chacun de vos modules, creez un fichier bootstrap comme celui-ci:

Exemple pour votre module Frontend:

Code:

[lang=php]
class Frontend_Bootstrap extends Zend_Application_Module_Bootstrap
{
}

Ceci vous permet de supprimer la routine d'initialisation:

Code:

[lang=php]
    protected function _initAutoload()
    {
        $loader = new Zend_Application_Module_Autoloader(array(
            'namespace' => '',
            'basePath'  => APP_PATH));
        return $loader;
    }

qui est située dans votre bootstrap principal.

Ensuite, dans votre fichier de configuration, procédez comme suite:

Exemple:

Code:

[production]
    phpSettings.display_startup_errors = 0
    phpSettings.display_errors = 0

    bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
    bootstrap.class = "Bootstrap"

    ; Autoloader namespaces
    autoloadernamespaces[] = "Zend_"

    ; Front controller
    resources.frontController.env = APPLICATION_ENV
    resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
    resources.frontController.defaultModule = "Frontend"
    resources.frontController.throwErrors = false
    resources.frontController.throwExceptions = false
    resources.frontController.params.displayExceptions = 0

    ; modules (needed to run per module bootstrap) and initialize per module namespaces
    resources.modules[] = ""

[staging : production]

[testing : production]
    phpSettings.display_startup_errors = 1
    phpSettings.display_errors = 1

[development : production]
    phpSettings.display_startup_errors = 1
    phpSettings.display_errors = 1

    resources.frontController.throwExceptions = false
    resources.frontController.params.displayExceptions = 1

Notez que cet exemple n'est pas complet (layout, view...).

Enfin, merci de nous communiquer le contenu de votre fichier index.php.

Dernière modification par nuxwin (12-05-2011 16:04:26)

Hors ligne

 

#5 12-05-2011 16:18:32

moip
Membre
Date d'inscription: 10-05-2011
Messages: 13

Re: Probléme controler No default controller directory

Je viens de changer mon bootstrap principal et j'ai ajouté un bootstrap par module et changer mon application.ini, maintenant quand je test je charge bien mon module. Je poste quand même mon index.php au ca ou tu y trouve des choses inutile ou optimisable je prend :)
Et j'ai une autre petits question si je veux ajouter un base de donnée à mon projet je vais ajouté directement dans mon dossier Frontend car je l'utilise qu'avec le module là, et les formulaires pareil ?

Merci beaucoup

Code:

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

// Define the absolute path to our root folder
define('BASE_PATH', dirname(dirname(__FILE__)));

// Define the absolute path to our application folder
define('APP_PATH', BASE_PATH . '/application');

//Add the library folder to PHP's include path
set_include_path(BASE_PATH.'/library'
    . PATH_SEPARATOR . APP_PATH.'/models'
    . PATH_SEPARATOR . BASE_PATH.'/library/Zend'
    . PATH_SEPARATOR . APP_PATH.'/configs'
    . PATH_SEPARATOR . get_include_path()); 

// Zend_Application
require 'Zend/Application.php';
$application = new Zend_Application(APPLICATION_ENV,realpath(APP_PATH . '/configs/application.ini'));
$application->bootstrap();
$application->run();

?>

Dernière modification par moip (12-05-2011 16:21:25)

Hors ligne

 

#6 12-05-2011 17:00:09

nuxwin
Membre
Lieu: Caen (14)
Date d'inscription: 17-03-2011
Messages: 66

Re: Probléme controler No default controller directory

Re ;

En ce qui me concerne, mon fichier index.php est

Code:

[lang=php]
<?php

defined('ROOT_PATH') || define('ROOT_PATH', realpath(dirname(__FILE__)));
defined('APPLICATION_PATH') || define('APPLICATION_PATH', ROOT_PATH . '/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(ROOT_PATH . '/library', get_include_path())));

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

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

Dans votre fichier index.php, plein de dossiers sont ajoutés à l'include path ce qui ne devrait pas être le cas.

Pour ce qui est de votre deuxième question:

A. Base de données:

Je vous conseil de configurer votre base de données dans votre fichier application.ini directement

Exemple:

Code:

[production]
    resources.db.adapter = "pdo_mysql"
    resources.db.params.charset = "utf8"
    resources.db.params.host = "localhost"
    resources.db.params.username = "USER"
    resources.db.params.password = "PASSWORD"
    resources.db.params.dbname = "site"
    resources.db.params.profiler = false
    resources.db.isDefaultTableAdapter = true
    ;resources.db.params.persistent = true

La connexion ne sera établie avec le serveur MySQL que lorsque vous l'utiliserez.

Après, tout dépend comment vous voulez utiliser la ressource. Si vous désirez créer des requêtes au sein de vos contrôleurs directement, je vous conseille d'ajouter une routine de ce genre dans votre bootstrap principal:

Code:

[lang=php]
    /**
     * initializes the database connection and registers it in registry for further usage
     *
     * @return null|Zend_Db_Adapter_Abstract
     */
    protected function _initDatabase()
    {
        if ($this->hasPluginResource('db')) {
            $this->bootstrap('db');
            /**
             * @var $db Zend_Db_Adapter_Abstract
             */
            $db = $this->getResource('db');
            Zend_Registry::set('db', $db);

            return $db;
        }

        return null;
    }

Ensuite, dans vos contrôleurs, vous pourrez récupérer l'objet comme ceci:

Code:

[lang=php]
Frontend_IndexController extends Zend_Controller_Action {

    public function indexAction() {
        $db = Zend_Registry::get('db');
        $db->select()->........
    }

}

Maintenant, cette approche n'est pas la meilleur. Il est préférable de créer vos modèles en utilisant Zend_Db_Table_Abstract comme suite:

Exemple pour votre module Frontend:

Fichier application/modules/Frontend/models/DbTable/Post.php

Code:

[lang=php]
class Frontend_Model_DbTable_Post extends Zend_Db_Table_Abstract
{
    /**
     * Database table to operate on
     *
     * @var string
     */
    protected $_name = 'posts';

    /**
     * Primary key
     *
     * @var string
     */
    protected $_primary = 'id';
}

Ce qui vous permet dans vos contrôleurs de faire:

Code:

[lang=php]
Frontend_IndexController extends Zend_Controller_Action {

    public function showAction() {
        $model = new Blog_Model_DbTable_Post();
        $post = $model->find(1)->current();

        if(!$post) {
            throw new Zend_Controller_Action_Exception('Post not found!', 404);
        }

        $this->view->assign('post', $post->toArray()); 
    }
}

B. Formulaires:

Pour ce qui est de vos formulaires, voici un exemple:

Fichier application/modules/Frontend/forms/Login.php

Code:

[lang=php]
class Frontend_Form_Login extends Zend_Form
{
    /**
     * Form initialization
     *
     * @return void
     */
    public function init()
    {
        $this->setName('loginForm');
        $this->setElementsBelongTo('loginForm');

        $element = new Zend_Form_Element_Text('username');
        $element->setLabel('Username')
            ->setRequired(true)
            ->addFilter('StripTags')
            ->addFilter('StringTrim');
        $this->addElement($element);

        $element = new Zend_Form_Element_Password('password');
        $element->setLabel('Password')
            ->setRequired(true)
            ->addFilter('StripTags')
            ->addFilter('StringTrim');
        $this->addElement($element);

        $element = new Zend_Form_Element_Submit('submit');
        $element->setLabel('Connection');
        $this->addElement($element);
    }
}

Ensuite, dans vos contrôleurs, vous pouvez utiliser le formulaire comme ceci :

Code:

Frontend_IndexController extends Zend_Controller_Action {

    public function loginAction()
    {
        $form = Frontend_Form_Login extends Zend_Form;
        
        if($this->_request->isPost()) {
            .....
        }


        $this->view->assign('form', $form); 
    }
}

Notez qu'il ne s'agit que de simples exemples non fonctionnels en l'état.

Cordialement ;

Dernière modification par nuxwin (12-05-2011 17:02:32)

Hors ligne

 

#7 21-03-2014 23:35:24

Anis J
Nouveau membre
Date d'inscription: 21-03-2014
Messages: 1

Re: Probléme controler No default controller directory

Bonjour a tous,
j'ai le même problème et je ne trouve pas ma bêtise !! sad
voici une portion de mon application.ini
[bootstrap]
    Autoloadernamespaces[] = "Zend_"
    Autoloadernamespaces[] = "Custom_"
    Autoloadernamespaces[] = "Frontoffice_"
        Autoloadernamespaces[] = "Admin_"
   
        ;added by Anis 21-02-2014
        resources.frontController.defaultControllerName = "index"
    resources.frontController.defaultAction = "index"
        ;end added by Anis 21-02-2014
    resources.frontController.moduleDirectory = APPLICATION_PATH"/modules"
    resources.frontController.defaultModule = "frontoffice"
    resources.frontController.throwErrors = false
    resources.modules[] = ""
    resources.layout.layout = "layout"
    resources.layout.pluginClass = "Custom_Controller_Plugin_ModuleBasedLayout"
    resources.view.encoding = "UTF-8"
    resources.view.basePath = APPLICATION_PATH "/views/"

mon bootstrap principal:
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
    #stores a copy of the config object in the Registry for future references
    #!IMPORTANT: Must be runed before any other inits

    protected function _initConfig() {
        Zend_Registry::set('config', new Zend_Config($this->getOptions()));
    }

    #Initializes the default timezone for the php ENV

    protected function _initDate() {
        date_default_timezone_set(Zend_Registry::get('config')->settings
                ->application
                ->datetime);
    }

    #stores a copy of all the database adapters in the Registry for future references

    protected function _initDatabases() {
        $this->bootstrap('multidb');
        $resource = $this->getPluginResource('multidb');
        $databases = Zend_Registry::get('config')->resources->multidb;
        foreach ($databases as $name => $adapter) {
            $db_adapter = $resource->getDb($name);
            Zend_Registry::set($name, $db_adapter);
        }
    }

}

le bootstrap de mon module admin
class Admin_Bootstrap extends Zend_Application_Module_Bootstrap {

    protected function _initLibraryAutoloader() {
        return $this->getResourceLoader()
                        ->addResourceType('library', 'library', 'library');
    }
   
     protected function _initAutoload() {
        $autoloader = new Zend_Loader_Autoloader_Resource(array(
                    'namespace' => '',
                    'basePath' => APPLICATION_PATH . DS . "modules" . DS . "admin",
                    'resourceTypes' => array(
                        'form' => array(
                            'path' => 'forms',
                            'namespace' => 'Form',
                                                ),
                        'model' => array(
                            'path' => 'models',
                            'namespace' => 'Model',
                                                    ),
                    )
                ));
        return $autoloader;
    }

}

Help plz je galère depuis deux jours déjà sad

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages