Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 10-11-2009 21:53:39

crazycorp
Nouveau membre
Date d'inscription: 10-11-2009
Messages: 8

Class non trouvée, obliger de faire include_once ?

Bonjour à tous,

Voila je lis depuis quelque temps des livres sur Zend Framework et depuis quelques jours j'ai décidé de m'y mettre..

Cependant je rencontre un problème, voila mon arbo :

Code:

application/
--Controllers
--Layouts
--Models
--Views
Library
Public

dans mon fichier index.php j'ai ce code la :

Code:

$paths = array(
APPLICATION_PATH . './library',
APPLICATION_PATH . '/application/models/',
get_include_path()
);

Mon fichier index.php j'ai ceci

Code:

    function indexAction()
    {
        $TopSite = new TopSites();
        $this->view->topsites = $TopSite->fetchAll();
    }

Dans mon fichier models/TopSites.php j'ai ceci :

Code:

<?php

/**
 * Class TopSites
 *  
 * @author Crazy
 * @version 
 */


class TopSites extends Zend_Db_Table {
    /**
     * The default table name 
     */
    protected $_name = 'topsites';
}

Lors de l'appel du fichier Index.php, j'ai ce message d'erreur

Code:

Fatal error: Class 'TopSites' not found in W:\wamp\www\debutZend\application\controllers\IndexController.php on line 9

Le seul moyen pour que ça fonctionne, c'est de placer include_once(models/Topsites.php) dans mon fichier IndexController.php..

Pouvez-vous m'aider ?

Hors ligne

 

#2 10-11-2009 22:58:18

dev-k
Membre
Lieu: Barcelona
Date d'inscription: 18-07-2009
Messages: 77
Site web

Re: Class non trouvée, obliger de faire include_once ?

Hors ligne

 

#3 10-11-2009 23:16:30

crazycorp
Nouveau membre
Date d'inscription: 10-11-2009
Messages: 8

Re: Class non trouvée, obliger de faire include_once ?

Merci de ton aide, j'ai utilisé

Zend_Loader::loadClass('TopSites', 'models/TopSites.php');

et ça fonctionne maintenant, mais je vais devoir faire ça a chaque fois ?
Je ne vois pas trop quelle section de la doc me concerne ? celui sur les Namespace  ? ou les Resources

Hors ligne

 

#4 11-11-2009 09:51:10

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: Class non trouvée, obliger de faire include_once ?

Salut,

Il faut respecter les namespace définit par Zend ou bien définir les tiens.

Par défaut, les noms des classes (et non pas des fichiers) dans le dossier models doivent être préfixés par "Model_", dans ce cas l'autoloader de Zend sera capable de les charger.

Et c'est vrai pour toutes les ressources. Il s'agit en fait d'associer un namespace à un dossier.

Un petit tour dans la source de "Zend_Application_Module_Autoloader" pour voir les ressources définis par défaut.


A+ benjamin.

Dernière modification par Delprog (11-11-2009 09:51:44)


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#5 11-11-2009 11:31:34

dev-k
Membre
Lieu: Barcelona
Date d'inscription: 18-07-2009
Messages: 77
Site web

Re: Class non trouvée, obliger de faire include_once ?

Dans ton bootstrap, il faut initialiser l'autoloader, en utilisant Zend_Application_Module_Autoloader comme le signale Delprog.

Code:

protected function _initAppAutoload()
{
    $autoloader = new Zend_Application_Module_Autoloader(array(
    'namespace' => '',
    'basePath' => dirname(__FILE__),
    ));
            
    return $autoloader;
}

si tu fais un Zend_Debug::dump($autoloader); tu verras les namespaces par défaut
Evidemment tu peux changer les namespaces ainsi que les chemins vers tes classes.

A+

Hors ligne

 

#6 11-11-2009 12:45:28

crazycorp
Nouveau membre
Date d'inscription: 10-11-2009
Messages: 8

Re: Class non trouvée, obliger de faire include_once ?

Merci de votre aide,
j'ai donc renommé ma classe Model_Topsites mais ça ne fonctionne toujours pas.

Ensuite pour ce qui est de la fonction dev-k, je n'ai pas de fichier bootstrap.php, tout est dans mon fichier index.php et je ne vois pas vraiment où placer ça ^^

J'ai quand même placer

Code:

$autoloader->registerNamespace('Model_');
Zend_Debug::dump($autoloader);

Et je vois bien mon namespace Model_ mais toujours Class not found sad

Dernière modification par crazycorp (11-11-2009 12:47:58)

Hors ligne

 

#7 11-11-2009 12:51:24

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: Class non trouvée, obliger de faire include_once ?

Tu utilises quelle version du ZF ?

A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#8 11-11-2009 12:51:39

crazycorp
Nouveau membre
Date d'inscription: 10-11-2009
Messages: 8

Re: Class non trouvée, obliger de faire include_once ?

1.9.5 minimal

Hors ligne

 

#9 11-11-2009 13:27:17

dev-k
Membre
Lieu: Barcelona
Date d'inscription: 18-07-2009
Messages: 77
Site web

Re: Class non trouvée, obliger de faire include_once ?

et t'as renommé ta classe TopSites en Model_TopSites ??

Dernière modification par dev-k (11-11-2009 13:33:52)

Hors ligne

 

#10 11-11-2009 16:56:32

crazycorp
Nouveau membre
Date d'inscription: 10-11-2009
Messages: 8

Re: Class non trouvée, obliger de faire include_once ?

Oui oui

Hors ligne

 

#11 11-11-2009 20:39:11

crazycorp
Nouveau membre
Date d'inscription: 10-11-2009
Messages: 8

Re: Class non trouvée, obliger de faire include_once ?

Personne n'a d'idée ?

Hors ligne

 

#12 11-11-2009 20:48:54

dev-k
Membre
Lieu: Barcelona
Date d'inscription: 18-07-2009
Messages: 77
Site web

Re: Class non trouvée, obliger de faire include_once ?

fais voir ton index.php

Hors ligne

 

#13 11-11-2009 21:18:42

crazycorp
Nouveau membre
Date d'inscription: 10-11-2009
Messages: 8

Re: Class non trouvée, obliger de faire include_once ?

Le voila :

Code:

<?php
error_reporting(E_ALL|E_STRICT);
ini_set('display_errors', 1);
date_default_timezone_set('Europe/Paris');
define('APPLICATION_PATH' ,"W:/wamp/www/debutZend");
// mise en place des rpertoires et chargement des classes
$paths = array(
APPLICATION_PATH . './library',
APPLICATION_PATH . '/application/models/',
get_include_path()
);
set_include_path(implode(PATH_SEPARATOR, $paths));
require_once 'Zend/Loader/Autoloader.php';

$autoloader = Zend_Loader_Autoloader::getInstance();

//test
$autoloader->registerNamespace('Application_');
$autoloader->registerNamespace('Model_');

//Zend_Loader::loadClass('TopSites', 'models/TopSites.php');

// Chargement de la configuration

$registry = Zend_Registry::getInstance();
Zend_Debug::dump($autoloader);

// Mise en place de la BDD
$params = array(
    'host'     => '127.0.0.1',
    'username' => '',
    'password' => '',
    'dbname'   => ''
);

$db = Zend_Db::factory('PDO_MYSQL', $params);
Zend_Db_Table::setDefaultAdapter($db);


// Mise en place du contrôleur
$frontController = Zend_Controller_Front::getInstance();

$frontController->throwExceptions(true);
$frontController->setControllerDirectory('./application/controllers');
Zend_Layout::startMvc(array('layoutPath'=>'./application/layouts'));

// run!
$frontController->dispatch();

Hors ligne

 

#14 11-11-2009 22:18:15

dev-k
Membre
Lieu: Barcelona
Date d'inscription: 18-07-2009
Messages: 77
Site web

Re: Class non trouvée, obliger de faire include_once ?

Déjà si tu utilises la dernière version, tu devrais jeter un coup d'oeil au Quickstart pour commencer un projet avec le zend framework.
La manière dont tu procèdes est correcte mais un peu "vieille". C'est comme ça que l'on procédait il me semble avant la version 1.8 ou 1.7. Mais ça c'est à toi de voir.
http://framework.zend.com/docs/quickstart

Ensuite à la place de

Code:

define('APPLICATION_PATH' ,"W:/wamp/www/debutZend");
$paths = array(
APPLICATION_PATH . './library',
APPLICATION_PATH . '/application/models/',
get_include_path()
);

préfères

Code:

define('APPLICATION_PATH' ,realpath( dirname( __FILE__ ) ));
$paths = array(
APPLICATION_PATH . '/library',
APPLICATION_PATH . '/application/models',
get_include_path()
);

Essaye ça aussi

Code:

$loader = new Zend_Application_Module_Autoloader(array(
    'namespace' => '',
    'basePath'  => APPLICATION_PATH
));

Hors ligne

 

#15 11-11-2009 22:22:41

crazycorp
Nouveau membre
Date d'inscription: 10-11-2009
Messages: 8

Re: Class non trouvée, obliger de faire include_once ?

Merci pour ta réponse,

pour tes corrections, je voulais savoir ou placer

Code:

$loader = new Zend_Application_Module_Autoloader(array(
    'namespace' => '',
    'basePath'  => APPLICATION_PATH
));

à la place de :

Code:

$autoloader = Zend_Loader_Autoloader::getInstance();

?

Je pense que je vais tout recommencer avec le QuickStart alors smile

Hors ligne

 

#16 12-11-2009 10:34:33

dev-k
Membre
Lieu: Barcelona
Date d'inscription: 18-07-2009
Messages: 77
Site web

Re: Class non trouvée, obliger de faire include_once ?

Oui configure ton application de la manière dont c'est fait dans le Quickstart, c'est beaucoup plus maintenable

Bon courage

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