Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 19-08-2014 17:56:09

Shudrum
Nouveau membre
Date d'inscription: 19-08-2014
Messages: 7

Question sur la logique modulaire et des classes métier.

Bonjour tout le monde !

Comme c'est mon premier post, je me présente vite fait ! J'ai 31 ans, ça fait ... un peu moins de 10 ans que je fais du web professionnellement, passé ma certif php (un peu déçu, je m'attendais à plus dur) mais jamais fait de FW digne de ce nom !

J'ai donc commencé Zend jeudi dernier, je me suis offert un des bouquins que vous conseillez (Zend Framework 2 - Industrialisez vos développements PHP) mais je bloque quand même pas mal. L'idée est que je cherche à me faire un portfolio photo histoire d'apprendre, donc je fais tout de A à Z car ça ne sert à rien de tout reprendre, on apprend rien !

J'ai pas mal fouillé sur le net, mais je ne trouve pas de réponse à ma question, sûrement que je cherche mal, du coup vous allez surement m'aiguillier comme il se doit !


Donc voilà, pour l'instant, je me suis fait les modules suivants (en partant évidemment du skeleton) :

Code:

[lang=php]array(
    Application, // Base du front end
    Backoffice,  // Base du back end
    Folder,      // Module de gestion des dossiers
    Photo,       // Module de gestion des photos
    Login,       // Système de connexion pour le back end
),

Actuellement, mon problème se pose pour le module photo : ce module n'a aucunement besoin d'un système MVC car il n'a pas de vues / contrôleurs (peut être à tord) mais uniquement de modèles, et là encore, j'ai un doute.

Du coup, pour l'instant mon module se limite à ceci :

Code:

[lang=php]+-Photo
   +-config
   |  +-module.config.php
   +-src
   |  +-Photo
   |     +-Photo.php
   |     +-PhotoFolder.php
   +-Module.php

Actuellement, j'aimerais ajouter dans le fichier de configuration du module des informations pour le traitement des photos comme la taille maximum des miniatures par exemple. Le tout en exploitant le fichier de configuration de base car il est mergé avec le fichier de configuration principal, fonction que j'aimerais garder.

J'ai beau fouiller, je ne vois pas comment faire ...

Quelqu'un aurait une idée ? Car dans mes classes Photo et PhotoFolder, je n'étend de rien car elles sont directement instanciées quand j'en ai besoin ... du coup je ne vois pas du tout quoi faire ...

Merci beaucoup !

Hors ligne

 

#2 19-08-2014 18:10:48

shishi
Membre
Date d'inscription: 17-03-2013
Messages: 67

Re: Question sur la logique modulaire et des classes métier.

Bonjour,

pour ajouter de la configuration tu peux ajouter un fichier "photo.local.php" dans le dossier config\Autoload\

et dans ce fichier tu peux faire ceci :

Code:

return array(
'photo' => array(
 'maxFileSize' => '2MB', 
)
)

tu met tout ce que tu veux.

et pour récupérer la config tu as juste a faire par exemple dans un controller :

Code:

$config = $this->getServiceLocator()->get('config');
$configPhoto = $config['photo'];

voila j'espère que cela t'aidera

Hors ligne

 

#3 19-08-2014 18:49:21

Shudrum
Nouveau membre
Date d'inscription: 19-08-2014
Messages: 7

Re: Question sur la logique modulaire et des classes métier.

Merci !

Mais là est mon problème, ma classe Photo n'étend de rien, je l'instantie en faisant un simple new, du coup, j'ai pas accès au service dont tu parles.

Comme je disait, je suis nouveau en Zend du coup je ne sais pas trop quoi mettre comme héritage et le système de service m'est encore assez abstrait ...

Merci !

Hors ligne

 

#4 20-08-2014 09:12:37

shishi
Membre
Date d'inscription: 17-03-2013
Messages: 67

Re: Question sur la logique modulaire et des classes métier.

Bonjour,

effectivement j'avais oublié que tu n'avais pas de service ou repository pour gérer tes photos.

tu peux peut être passez le tableau de configuration au constructeur de ta class Photo ou encore instancier ta class photo via une fabrique.

cordialement

Hors ligne

 

#5 20-08-2014 10:22:22

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Question sur la logique modulaire et des classes métier.

Salut, je te conseil aussi un autre livre, celui de Vincent Blanchon, il porte sur une vieille version du framework (il me semble que c'est la beta) mais il aborde pas mal de points très intéressant et développe en détail le fonctionnement des composants du ZF2. Ce livre est moins facile d'accès que celui que tu as déjà mais si tu as de l'expérience dans le PHP ça sera abordable. Le livre est vraiment bien foutu smile.

Pour ton module c'est pas gênant de ne pas avoir de "MVC" tu peux très bien avoir un module avec un fichier de conf, un service et un modèle smile. Dans ton cas je te conseil de faire comme dit shishi, c'est à dire faire un tableau de configurations et en utilisant une classe Option tu vas pouvoir transformer se tableau en une classe. Tu as pas mal d'exemple sur ce repo github : https://github.com/zf-fr
Ensuite tu créés ton service en passant par une factory et tu lui passes ta classe Option via le constructeur et tu auras tout ce dont il te faut smile.

Hors ligne

 

#6 20-08-2014 11:32:04

Shudrum
Nouveau membre
Date d'inscription: 19-08-2014
Messages: 7

Re: Question sur la logique modulaire et des classes métier.

Merci beaucoup, je regarde tout ça et je reviens vers vous !

Hors ligne

 

#7 20-08-2014 13:50:57

Shudrum
Nouveau membre
Date d'inscription: 19-08-2014
Messages: 7

Re: Question sur la logique modulaire et des classes métier.

Donc, voici où j'en suis par rapport à ce que tu me dis Shishi :

Code:

[lang=php]public function getServiceConfig()
{
    return array(
        'factories' => array(
            'Photo' => function(ServiceManager $sm) {
                $config = $sm->get('config');
                $photo = new Photo($config['photo']);
                return $photo;
            },
        ),
    );
}

Du coup j'ai bien ma configuration ! En gros, le must est de toujours passer par un service pour instantier une classe afin de pouvoir chopper les paramètres si j'ai bien compris. Va falloir que je voie également comment faire en sorte d'écouter les évènements.

Ce système de service m'est encore bien abstrait, va falloir que je planche dessus.

Merci beaucoup ! Dites moi si je suis dans le faux ^^

P.S. : J'ai fait en sorte que mon boss commande le bouquin que tu m'as conseillé Orkin smile

Hors ligne

 

#8 20-08-2014 14:54:34

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Question sur la logique modulaire et des classes métier.

Tu peux créer directement une classe de factory c'est plus propre ça évite de passer par des fonctions anonymes et tu peux aussi utiliser une classe d'Option au lieu de passer directement la configuration smile.

Hors ligne

 

#9 20-08-2014 15:30:53

Shudrum
Nouveau membre
Date d'inscription: 19-08-2014
Messages: 7

Re: Question sur la logique modulaire et des classes métier.

La classe option est une évidence, mais pour l'instant m'en fou un peu, spa pour un vrai projet que je code, c'est juste pour apprendre smile

Après tu m'avais dit : "Ensuite tu créés ton service en passant par une factory et tu lui passes ta classe Option via le constructeur et tu auras tout ce dont il te faut smile."

C'est ce que je pensais faire là tout de suite ^^'

Et vu que tu te répètes, c'est que je suis passé à côté de quelque chose là .... -_- J'vais tenter de voir quoi.

Merci !

Hors ligne

 

#10 20-08-2014 15:34:24

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Question sur la logique modulaire et des classes métier.

Bah là tu créés une factory via une fonction anonyme hors tu peux créer une classe dédiée dont c'est le rôle ça permet de pouvoir mettre en cache tes fichiers de configuration par exemple et c'est beaucoup plus propre smile.

Hors ligne

 

#11 20-08-2014 21:00:39

Shudrum
Nouveau membre
Date d'inscription: 19-08-2014
Messages: 7

Re: Question sur la logique modulaire et des classes métier.

Ok ok ok !

Donc, attention : invocation de pavé de texte !

Pour pousser plus loin toutes ces nouvelles notions, j'ai donc inclue la config et poussé un peu plus mon module.

Voici donc ma nouvelle arborescence :

Code:

[lang=php]+-Photo
   +-config
   |  +-module.config.php
   +-src
   |  +-Photo
   |     +-Config
   |     |  +-PhotoConfig.php
   |     +-Entity
   |     |  +-EntityAbstract.php
   |     |  +-Photo.php
   |     |  +-PhotoFolder.php
   |     +-Service
   |        +-PhotoFactory.php
   +-Module.php

Du coup, j'ai compris (je crois) l'entrée 'service' dans la configuration, donc voici ma nouvelle config :

Code:

[lang=php]return array(
    'photo' => array(
        'maximum_size' => 750,
    ),
    'service_manager' => array(
        'abstract_factories' => array(
            'Photo\Service\PhotoFactory',
        ),
        'invokables' => array(
            'photoConfig' => 'Photo\Config\PhotoConfig'
        ),
    ),
);

J'ai donc créé un peu maladroitement ma Factory :

Code:

[lang=php]namespace Photo\Service;
 
use Photo\Config\PhotoConfig;
use Photo\Entity\EntityAbstract;
 
use \Zend\ServiceManager\AbstractFactoryInterface;
use \Zend\ServiceManager\ServiceLocatorInterface;
 
class PhotoFactory implements AbstractFactoryInterface
{
    /**
     * Determine if we can create a service with name
     *
     * @param ServiceLocatorInterface $serviceLocator
     * @param                         $name
     * @param                         $requestedName
     * @return bool
     */
    public function canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
    {
        return (substr($name, 0, 11) === 'photoentity');
    }
 
    /**
     * Create service with name
     *
     * @param ServiceLocatorInterface $serviceLocator
     * @param                         $name
     * @param                         $requestedName
     * @return mixed
     */
    public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
    {
        $photoConfig = $this->getPhotoConfig($serviceLocator);
 
        /** @var EntityAbstract $entity */
        $entity = new $requestedName;
        if (is_subclass_of($entity, 'Photo\Entity\EntityAbstract'))
        {
            $entity->setConfig($photoConfig);
        }
 
        return $entity;
    }
 
    /**
     * Return the instance of the PhotoConfig
     *
     * @param ServiceLocatorInterface $serviceLocator
     * @return PhotoConfig
     */
    protected function getPhotoConfig(ServiceLocatorInterface $serviceLocator)
    {
        /** @var PhotoConfig $config */
        $photoConfig = $serviceLocator->get('photoConfig');
        if ($photoConfig->count() === null)
        {
            $config = $serviceLocator->get('config');
            $photoConfig->set($config['photo']);
        }
 
        return $photoConfig;
    }
}

Et ma classe Config :

Code:

[lang=php]namespace Photo\Config;
 
use Zend\Config\Config;
 
class PhotoConfig extends Config
{
    /**
     * Empty constructor to create an invokable class
     */
    public function __construct()
    {
    }
 
    /**
     * Set the configuration datas
     *
     * @param $array array
     */
    public function set($array)
    {
        parent::__construct($array);
    }
}

Tu penses que je me rapproche d'un truc propre ?

Merci beaucoup en tous cas !

Hors ligne

 

#12 21-08-2014 12:08:42

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Question sur la logique modulaire et des classes métier.

C'est pas vraiment comme ça en fait smile. Inspires toi de ce répo https://github.com/zf-fr/zfr-rest pour mettre ta classe Option et le chargement de tes configs smile.

Pour la conf de tes photos tu as compris le principe c'est comme ça qu'il faut faire ensuite la factory abstraite je vois pas l'intérêt pour créer un service fais une factory normale ça suffit largement. Les factory abstraites sont là pour créer plusieurs classes qui suivent la même implémentation.

Donc inspires toi du répo que je t'ai donné tu vas pouvoir comparer facilement et comprendre tes erreurs smile.

Hors ligne

 

#13 25-08-2014 11:32:03

Shudrum
Nouveau membre
Date d'inscription: 19-08-2014
Messages: 7

Re: Question sur la logique modulaire et des classes métier.

Bon bah maintenant mon système roule du tonnerre smile

J'avais regardé quelques dépôts comme tu me l'avais conseillé sur zf-fr, mais lesquels, je ne sais plus. Je comprend bien qu'avoir fait une factory en abstract était vraiment chelou mais Zend m'étais encore pas mal abstrait.

Du coup j'ai beaucoup lu, reçu le second bouquin conseillé et ca va beaucoup mieux smile

Encore merci ! Maintenant j'attaque les évènements :p

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