Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 24-02-2017 09:04:52

CinePhil
Membre
Date d'inscription: 24-03-2010
Messages: 19

Tutoriel getting started : Erreur 404 après la config BDD et vue index

Bonjour,

Je me remets à Zend Framework en vue d'un projet à développer et je refais le tutoriel pour ZF 3.

La seule chose que j'ai modifiée est l'accès à la BDD que j'ai essayé de configurer pour MySQL, grâce au tuto de Zend-DB au lieu du Sqlite donné par le tuto Getting Started.

J'ai mis ceci dans config/autoload/global.php :

Code:

[lang=php]
return [
    'db' => [
        'driver' => 'Pdo_Mysql',
        //'dsn'    => sprintf('sqlite:%s/data/zftutorial.db', realpath(getcwd())),
    'dsn'    => 'mysql:dbname=zf_tutorial;host=mon.ip;charset=utf8;username=monuser;password=monpassword',
    ],
];

Il y a aussi un passage du tuto que je n'ai pas bien compris :

Tutorial db-adapter a écrit:

Configuring the default adapter

Within your service factories, you may retrieve the default adapter from your application container using the class name Zend\Db\Adapter\AdapterInterface:

Code:

[lang=php]
use Zend\Db\Adapter\AdapterInterface;

function ($container) {
    return new SomeServiceObject($container->get(AdapterInterface::class));
}

Faut-il entrer ce code quelque part ou est-ce un exemple ?
Où faudrait-il le coller ?

J'obtiens une erreur 404 quand j'appelle http://zf-tutorial.localhost/album/ et je ne vois pas à quoi c'est dû.

Y a t-il un moyen de détecter d'où vient l'erreur ?
J'ai activé la barre de développement et les erreurs PHP. Ces dernières ne me donnent qu'un warning à propos de l'utilisation de date() dans module/Application/view/layout/layout.phtml, un fichier auquel je n'ai pas touché.

Hors ligne

 

#2 24-02-2017 14:46:35

tdutrion
Administrateur
Lieu: Dijon, Paris, Edinburgh
Date d'inscription: 23-12-2009
Messages: 613
Site web

Re: Tutoriel getting started : Erreur 404 après la config BDD et vue index

Alors dans l'ordre inverse des problèmes :

Pour le problème avec date, c'est que le timezone n'est pas définit dans ton php.ini. Selon le système sur lequel tu es, ce ne sera pas le même fichier. Tu dois faire un phpinfo, trouver quel php.ini est utilisé puis tu pourras l'éditer, trouver  la ligne timezone, la décommenter, et ensuite mettre en valeur Europe/Paris ou UTC selon tes préférences.

Pour le reste, le code donné est le code de la factory. Imaginons que tu aies un IndexController, dedans tu as un constructeur :

Code:

[lang=php]
class IndexController extends AbstractActionController
{
    public function __construct(Adapter $dbAdapter)
    {
        $this->dbAdapter = $dbAdapter;
    }

    public function albumAction()
    {
        //...
    }
}

Du coup pour injecter, tu utilises une factory (un callable, donc dans ton exemple une fonction anonyme, mais en vrai la plupart du temps ce sera une classe invokable).
Ça ça se défini dans la configuration, sous la clé controllers => factories pour les contrôleurs, et plus généralement sous service_manager => factories.

Hors ligne

 

#3 24-02-2017 15:50:30

CinePhil
Membre
Date d'inscription: 24-03-2010
Messages: 19

Re: Tutoriel getting started : Erreur 404 après la config BDD et vue index

Merci pour le timezone dans php.ini. smile

Par contre, le reste... rien compris ! sad

J'ai suivi le tuto, à part la config de la BDD.
Déjà pour ça, est-ce que ma config de BDD MySQL est bonne ?

Je n'ai pas de IndexController mais, comme dans le tuto, un AlbumController et, dans Model : une classe Album et une classe AlbumTable (pas encore compris l'utilité des deux alors qu'il me semble qu'avant il n'y avait qu'une classe modèle par table mais bon... bref).
Veux-tu dire que je dois ajouter ton code $this->dbAdapter = $dbAdapter; dans le constructeur de mon AlbumController ?
Actuellement, il n'y a que cette ligne :

Code:

$this->table = $table;

N'est-ce pas celle là qui est censée faire le lien vers les classes du modèle ?

Hors ligne

 

#4 27-02-2017 21:44:26

tdutrion
Administrateur
Lieu: Dijon, Paris, Edinburgh
Date d'inscription: 23-12-2009
Messages: 613
Site web

Re: Tutoriel getting started : Erreur 404 après la config BDD et vue index

Alors en fait le code de ta configuration

Code:

[lang=php]
 'db' => [
    'driver' => 'Pdo_Mysql',
    'dsn'    => 'mysql:dbname=zf_tutorial;host=mon.ip;charset=utf8;username=monuser;password=monpassword',
],

Cette config là permet à ZF de configurer un adapter de base de données. Je l'écrirais différemment pour la lisibilité (cf Zend Db documentation).

Code:

[lang=php]
'db' => [
    'driver' => 'Pdo_Mysql',
    'database' => 'zf_tutorial',
    'username' => 'monuser',
    'password' => 'monpassword',
    'hostname' => 'mon.ip',
    'port' => 3306
    'charset    ' => 'utf8',
],

Ensuite, il faut indiquer au service manager qu'il est capable de créer un objet Db adapter (toujours dans la config donc) :

Code:

[lang=php]
'service_manager' => [
    'factories' => array(
        \Zend\Db\Adapter\Adapter::class => \Zend\Db\Adapter\AdapterServiceFactory::class,
    ],
],

Une fois cela fait, il reste à l'injecter dans notre table. Pour cela, il faut trouver comment l'objet table est créé (toujours dans le service_manager donc). Si c'est dans une factory, on pourra utiliser $container->get(\Zend\Db\Adapter\Adapter::class); pour récupérer l'adaptateur et ensuite l'injecter. Si c'était un invokable, ben il faut faire une factory smile

Hors ligne

 

#5 01-03-2017 11:52:49

CinePhil
Membre
Date d'inscription: 24-03-2010
Messages: 19

Re: Tutoriel getting started : Erreur 404 après la config BDD et vue index

Ensuite, il faut indiquer au service manager qu'il est capable de créer un objet Db adapter (toujours dans la config donc) :

Donc dans le même fichier global.php où se trouve la définition de la db ?

Une fois cela fait, il reste à l'injecter dans notre table. Pour cela, il faut trouver comment l'objet table est créé (toujours dans le service_manager donc).

Concrètement, où ça ?

Dans global.php, et conformément au tutoriel, il n'y avait que la définition de la db.

Dans module/Album/config/module.config.php, il y avait cette portion de code :

Code:

'controllers' =>
    [
        'factories' =>
        [
            Controller\AlbumController::class => InvokableFactory::class,
        ],
    ],

Le tutoriel indique que cela peut être supprimé ; je me suis contenté de le commenter.
Il reste ce code :

Code:

'router' =>
    [
        'routes' =>
        [
            'album' =>
            [
                'type'    => Segment::class,
                'options' =>
                [
                    'route' => '/album[/:action[/:id]]',
                    'constraints' =>
                    [
                        'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'id'     => '[0-9]+',
                    ],
                    'defaults' =>
                    [
                        'controller' => Controller\AlbumController::class,
                        'action'     => 'index',
                    ],
                ],
            ],
        ],
    ],
    'view_manager' =>
    [
        'template_path_stack' =>
        [
            'album' => __DIR__ . '/../view',
        ],
    ],

J'ai aussi ceci, conformément au tutoriel, dans module/Album/src/Module.php :

Code:

class Module implements ConfigProviderInterface
{
    public function getConfig()
    {
        return include __DIR__ . '/../config/module.config.php';
    }
    
    public function getServiceConfig()
    {
        return [
                'factories' => [
                        Model\AlbumTable::class => function($container) {
                            $tableGateway = $container->get(Model\AlbumTableGateway::class);
                            return new Model\AlbumTable($tableGateway);
                        },
                        Model\AlbumTableGateway::class => function ($container) {
                            $dbAdapter = $container->get(AdapterInterface::class);
                            $resultSetPrototype = new ResultSet();
                            $resultSetPrototype->setArrayObjectPrototype(new Model\Album());
                            return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);
                        },
                        ],
                        ];
    }
    
    public function getControllerConfig()
    {
        return [
                'factories' => [
                        Controller\AlbumController::class => function($container) {
                            return new Controller\AlbumController(
                                    $container->get(Model\AlbumTable::class)
                                    );
                        },
                        ],
                        ];
    }
}

Bref, je m'y perds un peu. 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