Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
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 :
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 :
[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
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:
application/controllers
ou dans :
application/modules/XXXXX/controllers
Notez qu'avec une architecture modulaire comme la votre, il est possible de supprimer les répertoires:
/application/controllers /application/forms
et de n'utiliser que les modules
....
Dernière modification par nuxwin (12-05-2011 16:33:17)
Hors ligne
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
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:
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:
[lang=php] class Frontend_Bootstrap extends Zend_Application_Module_Bootstrap { }
Ceci vous permet de supprimer la routine d'initialisation:
[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:
[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
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
// 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
Re ;
En ce qui me concerne, mon fichier index.php est
[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:
[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:
[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:
[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
[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:
[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
[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 :
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
Bonjour a tous,
j'ai le même problème et je ne trouve pas ma bêtise !!
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à
Hors ligne
Pages: 1