Partage
  • Partager sur Facebook
  • Partager sur Twitter

Cours Architecture PHP professionnelle / Questions

    8 mars 2017 à 11:37:52

    Bonjour à tous,

    Tout d'abord, merci pour cet excellent tuto qui m'a permis de me familiariser avec de nombreuses nouvelles technos de développement (twig, silex, bootstrap).

    Je viens d'éplucher les 14 pages de ce sujet mais je ne trouve toujours pas la réponse à mon problème qui me pose tant de désagréments depuis maintenant une heure. Je suis à l'itération 6 et, après avoir suivi scrupuleusement et en ayant bien assimilé toutes les étapes, je me retrouve nez-à-nez avec l'erreur suivante : 

    ClassNotFoundException in TwigServiceProvider.php line 148:Attempted to load class "Twig_Environment" from the global namespace.
    Did you forget a "use" statement?

    1. in TwigServiceProvider.php line 148
    2. at TwigServiceProvider->Silex\Provider\{closure}(object(Application)) in TwigServiceProvider.php line 53
    3. at TwigServiceProvider->Silex\Provider\{closure}(object(Application)) in Container.php line 113
    4. at Container->offsetGet('twig') in routes.php line 5
    5. at {closure}()
    6. at call_user_func_array(object(Closure), array()) in HttpKernel.php line 153
    7. at HttpKernel->handleRaw(object(Request), 1) in HttpKernel.php line 68
    8. at HttpKernel->handle(object(Request), 1, true) in Application.php line 496
    9. at Application->handle(object(Request)) in Application.php line 477
    10. at Application->run() in index.php line 11

    Le soucis c'est que même en téléchargeant l'archive GIT j'ai la même erreur. 

    Voici le contenu de mon fichier routes.php :

    <?php
    // Home page
    $app->get('/', function () use ($app) {
        $articles = $app['dao.article']->findAll();
        return $app['twig']->render('index.html.twig', array('articles' => $articles));
    });
    

    Celui de mon fichier app.php

    <?php
    
    use Symfony\Component\Debug\ErrorHandler;
    use Symfony\Component\Debug\ExceptionHandler;
    
    // Register global error and exception handlers
    ErrorHandler::register();
    ExceptionHandler::register();
    
    // Register service providers.
    $app->register(new Silex\Provider\DoctrineServiceProvider());
    $app->register(new Silex\Provider\TwigServiceProvider(), array(
        'twig.path' => __DIR__.'/../views',
    ));
    $app->register(new Silex\Provider\AssetServiceProvider(), array(
        'assets.version' => 'v1'
    ));
    // Register services.
    $app['dao.article'] = function ($app) {
        return new silex\DAO\ArticleDAO($app['db']);
    };

    et enfin mon index.html.twig

    <!doctype html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link href="{{ asset('/lib/bootstrap/css/bootstrap.min.css') }}" rel="stylesheet">
        <link href="{{ asset('/css/microcms.css') }}" rel="stylesheet">
        <title>MicroCMS - Home</title>
    </head>
    <body>
        <div class="container">
            <nav class="navbar navbar-default navbar-fixed-top navbar-inverse" role="navigation">
                <div class="container">
                    <div class="navbar-header">
                        <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-collapse-target">
                            <span class="icon-bar"></span>
                            <span class="icon-bar"></span>
                            <span class="icon-bar"></span>
                        </button>
                        <a class="navbar-brand" href="">MicroCMS</a>
                    </div>
                    <div class="collapse navbar-collapse" id="navbar-collapse-target">
                    </div>
                </div><!-- /.container -->
            </nav>
            {% for article in articles %}
            <article>
                <h2>{{ article.title }}</h2>
                <p>{{ article.content }}</p>
            </article>
            {% endfor %}
            <footer class="footer">
                <a href="https://github.com/bpesquet/OC-MicroCMS">MicroCMS</a> is a minimalistic CMS built as a showcase for modern PHP development.
            </footer>
        </div>
    </body>
    </html>


    Le problème semble venir de cette ligne du fichier routes.php :

    return $app['twig']->render('index.html.twig', array('articles' => $articles));
    

    Cependant le $app['twig'] devrait marcher puisque j'ai bien déclaré le service dans mon fichier app.php. Quelqu'un pourrait m'aider ?

    Merci ! =) 

    PS : Voici le composer.json au cas où 

    {
        "require": {
            "silex/silex": "~2.0",
            "doctrine/dbal": "~2.5",
            "twig/twig": "~1.28",
            "symfony/twig-bridge": "~2.8|3.0.*",
            "symfony/asset": "~2.8|3.0.*"
        },
        "autoload": {
            "psr-4": {"silex\\": "src"}
        }
    }



    -
    Edité par Seeryos 8 mars 2017 à 11:39:31

    • Partager sur Facebook
    • Partager sur Twitter
      8 mars 2017 à 13:37:37

      Bonjour,

      Je pense que ça pourrait venir de l'architecture de votre projet. Si vous avez fait exactement comme le cours, alors il me semble qu'il y a une erreur. Votre autoload pointe sur le framework Silex et non pas sur la racine de votre projet : 

          "autoload": {
              "psr-4": {"MicroCMS\\": "src"}
          }

      C'est peut être ça, à voir! Tenez moi au courant si ce n'est pas ça, je regarderais plus en détails.

      (Un composer update après pour être sur.)

      Bon courage.

      -
      Edité par Osush 8 mars 2017 à 13:39:04

      • Partager sur Facebook
      • Partager sur Twitter
        8 mars 2017 à 13:42:21

        RESOLU :

        J'ai testé la technique de Osush. Changé l'autoload par "MicroCMS" avant de lancer un composer update, ce qui a provoqué une erreur puisque mon dossier s'appelle "silex", puis retour à un autoload "normal" à savoir "silex". En suite j'ai refait un composer update et ça fonctionne... 

        Je ne comprends pas trop ce qui a pu se passer mais merci beaucoup ;) 

        -
        Edité par Seeryos 8 mars 2017 à 13:47:23

        • Partager sur Facebook
        • Partager sur Twitter
          8 mars 2017 à 13:53:03

          Donc effectivement vous n'aviez pas tout à fait la même structure que le cours, donc tout est bien qui fini bien.

          Si je peux me permettre, vous ne devriez pas nommer votre répertoire du même nom que celui du framework. Afin d'éviter les erreurs ou même la confusion. D'autant que si vous avez plusieurs site en silex vous n'allez pas nommer vos répertoire silex1, silex2 etc... 

          je me permet de rajouter que dans ce cas précis (si je ne trompe pas) vous êtes dans l'espace de nom (namespace) silex ce qui est l'espace de nom du framework :

          // Register services.
          $app['dao.article'] = function ($app) {
              return new silex\DAO\ArticleDAO($app['db']);
          };

          qui devrait être :

          // Register services
          $app['dao.article'] = function ($app) {
              return new MicroCMS\DAO\ArticleDAO($app['db']);
          };

          Bonne continuation et bon courage.

          -
          Edité par Osush 8 mars 2017 à 13:58:05

          • Partager sur Facebook
          • Partager sur Twitter
            8 mars 2017 à 13:54:15

            Oui c'est en effet une mauvaise idée mais il s'agit de mon dossier de tuto. Je serai plus prudent à l'avenir ;) 

            Bonne fin de journée ;) 

            • Partager sur Facebook
            • Partager sur Twitter
              10 mars 2017 à 10:31:28

              Bonjour,

              J'ai un problème dans l'itération 9. Twig me renvoie l'erreur 'The "form" extension is not enabled' à la ligne 19 du twig "article" ("{{ form_start(commentForm) }}")

              J'ai relu le chapitre et j'ai bien vérifié mon composer :

              "require": {
                  "silex/silex": "v2.0.4",
                  "doctrine/dbal": "2.3.5",
                  "twig/twig": "2.x-dev",
                  "symfony/twig-bridge": "~2.8|3.0.*",
                  "symfony/asset": "~2.8|3.0.*",
                  "symfony/security": "3.2.x-dev",
                  "symfony/form": "~2.8|3.0.*",
                  "symfony/translation": "~2.8|3.0.*",
                  "symfony/config": "~2.8|3.0.*",
                  "symfony/validator": "3.2.x-dev"
                },

              J'utilise en général le gestionnaire Composer de PhpStorm, mais je doute que ce soit un problème de version.

              Une commande que j'aurais ratée ? Il a besoin d'être booté manuellement le service form ? (je fais bien les registers pour chaque dépendance)

              Merci d'avance :)

              • Partager sur Facebook
              • Partager sur Twitter
                10 mars 2017 à 12:28:37

                Bonjour,

                sans votre code ça risque d’être dur de vous aider plus, si vous avez bien vérifié votre code et que vous avez la condition dans la vue qui passe, c'est peut être au {{ form_start(commentForm) }} que ça coince. Je dirais (à chaud) de faire un "composer update" pour être sur déjà que tout est bien passé et de bien vérifier la partie app/route.php notamment.

                Ce que vous appelez un boot c'est l'instanciation et l'enregistrement dans le register donc vous l'avez fait normalement.

                Avec le code dans les différentes partie de votre projet ça serait surement plus facile de vous aider.

                Je vous envois mon composer qui marche au cas où (personnellement j'ai twig/extensions en plus et ma version de twig n'est pas la même) : 

                    "require": {
                        "silex/silex": "~2.0",
                        "doctrine/dbal": "~2.5",
                        "twig/twig": "~1.28",
                        "symfony/twig-bridge": "~2.8|3.0.*",
                        "symfony/asset": "~2.8|3.0.*",
                        "symfony/security": "~2.8|3.0.*",
                        "symfony/form": "~2.8|3.0.*",
                        "symfony/translation": "~2.8|3.0.*",
                        "symfony/config": "~2.8|3.0.*",
                        "twig/extensions": "~1.4",
                        "symfony/validator": "~2.8|3.0.*",
                        "symfony/monolog-bridge": "~2.8|3.0.*"
                    },

                Bon courage et bonne continuation.

                -
                Edité par Osush 10 mars 2017 à 12:32:28

                • Partager sur Facebook
                • Partager sur Twitter
                  10 mars 2017 à 12:35:55

                  Merci beaucoup, ça fonctionne ! :)

                  Bizarre tout de même. C'est peut-être Twig 2 qui pose problème. C'est la seule différence importante que je vois.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 mars 2017 à 1:37:10

                    Bonjour tout le monde,

                    je suis à l'exercice de fin (qui ne me semble pas trop difficile de prime abord). Cependant avant de commencer je teste voir ou on en est et dès que je clique sur un lien ça m'affiche une erreur et l'url est de ce genre...

                    http://weblinks/Controverse%20du%20GamerGate

                    La vue me semble correcte:

                     <a href="{{ link.url }}" class="list-group-item">{{ link.title }}
                                    <span class="small">Submitted by ?</span>
                                    </a>
                    

                    mais par contre si j'nverse link.url et link.title ça fonctionne parfaitement... et ça ne me semble pas logique du tout.

                    Est ce que quelqu'un pourrait m'éclaircir là dessus?

                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 mars 2017 à 23:55:51

                      Rebonjour j'ai avancé un peu.

                      J'ai ajouté la possibilité de se connecter dans le devoir de fin mais ce pendant quand j'essaie de me connecter ça me met la connection n'est pas sécurisée les identifiants saisis ici pourraient être compromis... et quand je saisi le nom et le motde passe ça ne fonctionne pas. Je cherche je cherche mais si quelqu'un peut m'éclairer l'aide est la bienvenue

                      • Partager sur Facebook
                      • Partager sur Twitter
                        13 mars 2017 à 0:03:59

                        Bonjour kid_jonath

                        Pour ton message d'il y a 22 h : relis les consignes de l'exercice (en particulier le point 1), et regarde en détail le code reçu pour cet exercice.

                        Pour ton message d'il y a 10 minutes : regarde ma question d'il y a 2 semaines et la réponse d'Osush juste dessous. (https://openclassrooms.com/forum/sujet/cours-architecture-php-professionnelle-questions?page=14#message-91527154)

                        -
                        Edité par dblbass 13 mars 2017 à 0:08:43

                        • Partager sur Facebook
                        • Partager sur Twitter
                          13 mars 2017 à 20:14:06

                          Merci beaucoup pour ta réponse c'est beaucoup plus clair ;-)

                          • Partager sur Facebook
                          • Partager sur Twitter
                            15 mars 2017 à 10:58:25

                            Bonjour à tous, 

                            J'en suis au stade du développement de la gestion de la bibliothèque (après l'itération 7), et je rencontre une erreur sans que j'arrive à comprendre d'oû elle vient : 

                            Lors de l'affichage de ma page d'accueil, j'ai l'erreur suivante : 

                             Erreur PHP Twig

                            Mes recherches sur le net me laissent que j'ai une incohérence ou un problème de version quelque part, mais je ne vois pas du tout où.

                            Pour info, voici le contenu de mon composer.json : 

                            {
                                "require": {
                                    "silex/silex": "~2.0",
                                    "doctrine/dbal": "~2.5",
                                    "twig/twig": "~1.28",
                                    "symfony/asset": "~2.8|3.0.*"		
                                },
                                "autoload": {
                                    "psr-4": {"MyBooks\\": "src"}
                                }
                            }

                            Le code complet est disponible sur mon espace Github
                            Quelqu'un aurait il une idée ou rencontré le même problème ? 

                            Merci d'avance,

                            • Partager sur Facebook
                            • Partager sur Twitter
                              15 mars 2017 à 15:39:40

                              Bonjour à tous!

                              Je bute depuis quelque temps sur l'itération 7 où j'ai cette erreur: The requested URL /article/1 was not found on this server.

                              J'ai fait tout ce qu'il faut notamment activer la réécriture de lien main en vain. L'autre solution peut être c'est .htaccess?

                              Cordialement,

                              • Partager sur Facebook
                              • Partager sur Twitter
                                15 mars 2017 à 22:52:20

                                Gilphe : Il te manque une ligne dans ton fichier composer.json. Moi j'ai mis cela :

                                {
                                    "require": {
                                        "silex/silex": "~2.0",
                                        "doctrine/dbal": "~2.5",
                                        "twig/twig": "~1.28",
                                        "symfony/twig-bridge": "~2.8|3.0.*",
                                        "symfony/asset" : "~2.8|3.0.*"
                                    },
                                    "autoload": {
                                        "psr-4": {"MicroCMS\\": "src"}
                                    }
                                }

                                Bam92 : Il faudrait être plus explicite dans ta description (environnement, config). Le message indique que le chemin n'a pas été trouvé. Cela peut signifier que la réécriture d'URL n'a pas fonctionné. Maintenant avec le peu d'info que tu donnes,  difficile d'en dire plus.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  16 mars 2017 à 8:45:23

                                  Raaaah, Merci beaucoup dblbass ! effectivement c'est beaucoup mieux ! :)

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    16 mars 2017 à 12:59:54

                                    Bonjour!

                                    J'ai pris le temps de parcourir le forum avant de poser ma question. J'ai donc appliqué le conseil donné surtout sur la page 1. La réécriture est bel et bien activée. Mon fichier *.json est bien à jour.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      16 mars 2017 à 20:45:49

                                      Bonsoir Bam92,

                                      Dans quel environnement travailles-tu ? Mac, Windows, Linux ?

                                      Es-tu sur que la réécriture d'URL est activée ? Sais-tu comment le vérifier ?

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        20 mars 2017 à 13:17:32

                                        Bonjour!

                                        Merci pour votre souci. Désolé de n'avoir pas posté. Le problème était déjà résolu. En fait mon fichier .htaccess n'était pas bon, il avait une extension .txt.

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          20 mars 2017 à 21:21:58

                                          Bonjour tout le monde,

                                          Jai un petit souci lors de mes tests fonctionnels du devoir de fin...

                                          le test sur l'url /link/submit renvoie un erreur alors que tout fonctionne normalement...

                                          There was 1 error:

                                          1) WebLinks\Tests\AppTest::testPageIsSuccessful with data set #1 ('/link/submit')
                                          TypeError: Argument 1 passed to Symfony\Component\Form\FormRenderer::renderBlock() must be an instance of Symfony\Component\Form\FormView, null given, called in /var/www/WebLinks/vendor/twig/twig/lib/Twig/Environment.php(462) : eval()'d code on line 66

                                          Est ce que quelqu'un a déjà eu cette erreur et est ce que quelqu'un peut m'éclairer là dessus?

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            21 mars 2017 à 21:55:16

                                            Bonsoir;

                                            Je suis à l'itération 8. J'essaie de me connecter j'ai toujours le problème de login failed. Quel est le mot de passe à utiliser? Moi je prends ce qui est donné en bdd.

                                            En plus, en cliquant sur le bouton Not Connected, je ne vois pas le menu déroulant Log in

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              22 mars 2017 à 10:12:25

                                              Bonjour,

                                              kid_jonath : peux-tu nous montrer le code exécuté derrière la route link/submit (en tout cas routes.php et éventuellement HomeController.php si tu l'as fait avec des classes pour les contrôleurs).

                                              bam92 : si tu as bien suivi le tuto, les infos sont dans le fichier db/content.sql

                                              JohnDoe --> john

                                              JaneDoe --> jane

                                              Pour le menu déroulant (Log in), il faut adapter le fichier layout.html.twig (dernier code HTML avant le bilan de l'itération 8)

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                22 mars 2017 à 12:37:56

                                                Merci!

                                                Je vois c'est en commentaire.

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  22 mars 2017 à 15:52:31 - Message modéré pour le motif suivant : Message complètement hors sujet


                                                    23 mars 2017 à 15:12:30

                                                    Bonjour!

                                                    Tu n'es pas sur le bon forum

                                                    Edit:

                                                    Bonjour à tous!

                                                    Je me vois finir lentement mais sûrement ce cours, j'en suis à la 10è itération (je me puni de tout finir aujourd'hui ou demain au plus tard).

                                                    J'apprécie énormément le framework Silex et je veux l'intégrer à mes projets de développement. Je me pose alors cette question: comment commencer son application? (je connais bien sûr mon objectif). Toujours commencer par la première itération? En fait je cherche une méthode efficace de conception avec PHP basé sur un framework (Silex).

                                                    Merci

                                                    -
                                                    Edité par Bam92 23 mars 2017 à 16:46:55

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      24 mars 2017 à 8:53:57

                                                      Bonjour,

                                                      Bam92:

                                                      Le tutoriel est là pour nous présenter les différents aspects de l'environnement, sans tout parachuter d'un coup.

                                                      Vouloir suivre toutes les itérations à chaque nouveau projet n'est pas forcément nécessaire.

                                                      Pour ma part j'imagine plutôt d'avoir une base de départ comportant l'essentiel de ce qui a été vu.

                                                      Comme base de départ à tout projet on peut imaginer par exemple

                                                      • gestion d'utilisateurs avec identification et rôles
                                                      • mise en page du site avec bootstrap
                                                      • utilisation de classe pour les contrôleurs

                                                      A partir de là on peut dériver sur n'importe quel projet.

                                                      Mais ce n'est que ma simple opinion.

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        24 mars 2017 à 11:18:48

                                                        Bonjour!

                                                        C'est déjà bien dit. Si les autres peuvent partager avec nous leur vision de la chose

                                                        J'ajoute ceci à la liste des FAQ (si ça peut être utile)

                                                        • Itération 11: il se peut qu'en exécutant le test vous rencontriez des erreurs (comme pour mon cas, j'en ai rencontrer 6). Il s'agissait d'un problème d'accès à la bdd. En effet, je n'utilise pas le même mot de passe que celui du cours, j'avais oublié de le modifier dans le dev.php. La solution consistait simplement à mettre le bon mot de passe.

                                                        -
                                                        Edité par Bam92 24 mars 2017 à 11:36:29

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          24 mars 2017 à 12:26:47

                                                          Bonjour,

                                                          J'ai bien suivi le cours de M. Pesquet et j'avoue que c'est très intéressant. Qu'il en soit remercié !
                                                          Après avoir donc suivi le cours, j'ai commencé à l'appliquer à mon cas. Et voilà que je suis confronté à un problème au niveau des formulaires.
                                                          Je m'explique :

                                                          J'ai deux classes (filière et structure). Une structure (de formation) peut avoir +sieurs filières mais une filière ne appartenir avoir qu'à une et une seule structure. Je veux donc faire un formulaire pour la filière qui contiendrait 2 champs. Un représentant le nom de la filière et un autre (une liste déroulante) contenant les sigles des structures.

                                                          Voilà ce à quoi réssemble mon code :

                                                          namespace MicroTest\Form\Type;
                                                          
                                                          use Symfony\Component\Form\AbstractType;
                                                          use Symfony\Component\Form\FormBuilderInterface;
                                                          use Symfony\Component\Form\Extension\Core\Type\TextType;
                                                          use Symfony\Bridge\Doctrine\Form\Type\EntityType; 
                                                          
                                                          class FiliereType extends AbstractType
                                                          {
                                                              
                                                          	public function buildForm(FormBuilderInterface $builder, array $options)
                                                              {
                                                          		
                                                                  $builder
                                                                      ->add('nom', TextType::class)
                                                                      ->add('structure', EntityType::class, array(
                                                          		  'class' => 'Domain:Structure',
                                                          		  'choice_label' => 'sigle',
                                                          		  'placeholder' => 'Choisir une structure'
                                                          	));
                                                              }
                                                          
                                                              public function getName()
                                                              {
                                                                  return 'filiere';
                                                              }
                                                          }

                                                          Voici le message d'erreur affiché :


                                                           

                                                          Aidez-moi les amis. :(
                                                          Merci d'avance à ceux et celles qui prendront un peu de leur précieux temps pour m'aider !

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            24 mars 2017 à 12:48:19

                                                            Bonjour!

                                                            Je n'arrive pas à bien cerner ton problème (peu d'infos fourni).

                                                            • Tout d'abord tu as bien déclaré les dépendances nécessaire et fait
                                                            composer update

                                                            ?

                                                            • Le DAO associé à ta classe est bien modifié?
                                                            • As-tu enregistré le ServiceProvider approprié? (Form pour ton cas)
                                                            • As-tu bien défini la route?
                                                            • As-tu généré la vue approprié?

                                                            Fournis nous plus d'info (ton contexte de travail, ...)

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              24 mars 2017 à 13:29:31

                                                              Merci Bam92 pour avoir déjà pris le temps de me répondre.

                                                              Voici le contenu du composer :

                                                              {
                                                                  "require": {
                                                                      "silex/silex": "~2.0",
                                                                      "doctrine/dbal": "~2.5",
                                                                      "twig/twig": "~1.28",
                                                              	"symfony/twig-bridge": "~2.8|3.0.*",
                                                                      "symfony/asset": "~2.8|3.0.*",
                                                              	"symfony/security": "~2.8|3.0.*",
                                                              	"symfony/form": "~2.8|3.0.*",
                                                              	"symfony/translation": "~2.8|3.0.*",
                                                              	"symfony/config": "~2.8|3.0.*",
                                                              	"twig/extensions": "~1.4",
                                                              	"symfony/validator": "~2.8|3.0.*",
                                                                      "symfony/monolog-bridge": "~2.8|3.0.*"
                                                                  },
                                                              	"require-dev": {
                                                                      "phpunit/phpunit": "~4.8",
                                                                      "symfony/browser-kit": "~2.8|3.0.*",
                                                                      "symfony/css-selector": "~2.8|3.0.*"
                                                                  },
                                                                  "autoload": {
                                                                      "psr-4": {"MicroTest\\": "src"}
                                                                  }
                                                              }

                                                              Voici les DAO :

                                                              • FiliereDAO
                                                              <?php
                                                              
                                                              namespace MicroTest\DAO;
                                                              
                                                              use MicroTest\Domain\Filiere;
                                                              
                                                              class FiliereDAO extends DAO 
                                                              {
                                                                  
                                                                  public function setStructureDAO(StructureDAO $structureDAO) {
                                                                      $this->structureDAO = $structureDAO;
                                                                  }
                                                              
                                                                  public function afficherTout() {
                                                                      $sql = "SELECT * FROM filiere ORDER BY idStructure, nom";
                                                                      $result = $this->getDb()->fetchAll($sql);
                                                              
                                                                      // Convert query result to an array of domain objects
                                                                      $entities = array();
                                                                      foreach ($result as $row) {
                                                                          $id = $row['id'];
                                                                          $entities[$id] = $this->buildDomainObject($row);
                                                                      }
                                                                      return $entities;
                                                                  }
                                                              	
                                                              	// Fonction d'ajout et de suppression de filière
                                                                  public function enregistrer(Filiere $filiere) {
                                                                      $filiereData = array(
                                                                          'nom' => $filiere->getNom(),
                                                                          'idStructure' => $filiere->getStructure()->getId()
                                                                          );
                                                              
                                                                      if ($filiere->getId()) {
                                                                          // La filière existe déjà : la mettre à jour
                                                                          $this->getDb()->update('filiere', $filiereData, array('id' => $filiere->getId()));
                                                                      } else {
                                                                          // La filière n'a jamais été créée : l'enregistrer
                                                                          $this->getDb()->insert('filiere', $filiereData);
                                                                          // Obtenir l'id de la nouvelle filiere créée et l'ajouter à l'entité.
                                                                          $id = $this->getDb()->lastInsertId();
                                                                          $filiere->setId($id);
                                                                      }
                                                                  }
                                                              	
                                                                  // Fonction de recherche de  filière
                                                                  public function rechercher($id) {
                                                                      $sql = "SELECT * FROM filiere WHERE id=?";
                                                                      $row = $this->getDb()->fetchAssoc($sql, array($id));
                                                              
                                                                      if ($row)
                                                                          return $this->buildDomainObject($row);
                                                                      else
                                                                          throw new \Exception("Aucune filère correspondant à l'id : " . $id);
                                                                  }
                                                              	
                                                              	// Rechercher par structure
                                                                  public function rechercherParStructure($structureId) {
                                                                      // The associated article is retrieved only once
                                                                      $structure = $this->structureDAO->rechercher($structureId);
                                                              
                                                                      // art_id is not selected by the SQL query
                                                                      // The article won't be retrieved during domain objet construction
                                                                      $sql = "SELECT * FROM filiere WHERE idStructure=? ORDER BY nom";
                                                                      $result = $this->getDb()->fetchAll($sql, array($structureId));
                                                              
                                                                      // Convert query result to an array of domain objects
                                                                      $filieres = array();
                                                                      foreach ($result as $row) {
                                                                          $filiereId = $row['id'];
                                                                          $filiere = $this->buildDomainObject($row);
                                                                          // The associated article is defined for the constructed comment
                                                                          $filiere->setStructure($structure);
                                                                          $filieres[$filiereId] = $filiere;
                                                                      }
                                                                      return $filieres;
                                                                  }
                                                              	
                                                                  // Fonction de suppression de la filière
                                                                  public function supprimer($id) {
                                                                      $this->getDb()->delete('filiere', array('id' => $id));
                                                                  }
                                                              	
                                                                  public function deleteAllByUser($userId) {
                                                                      $this->getDb()->delete('t_comment', array('usr_id' => $userId));
                                                                  }
                                                              	
                                                                 
                                                                  protected function buildDomainObject(array $row) {
                                                                      $filiere = new Filiere();
                                                                      $filiere->setId($row['id']);
                                                                      $filiere->setNom($row['nom']);
                                                                      
                                                              		if (array_key_exists('idStructure', $row)) {
                                                                          // Find and set the associated author
                                                                          $structureId = $row['idStructure'];
                                                                          $structure = $this->structureDAO->rechercher($structureId);
                                                                          $filiere->setStructure($structure);
                                                                      }
                                                                      
                                                                      return $filiere;
                                                                  }
                                                              }
                                                              
                                                              • StructureDAO
                                                              <?php
                                                              
                                                              namespace MicroTest\DAO;
                                                              
                                                              use MicroTest\Domain\Structure;
                                                              
                                                              class StructureDAO extends DAO
                                                              {
                                                                  
                                                                  public function afficherTout() {
                                                                      $sql = "SELECT * FROM structure ORDER BY nom";
                                                                      $result = $this->getDb()->fetchAll($sql);
                                                              
                                                                      // Convert query result to an array of domain objects
                                                                      $structures = array();
                                                                      foreach ($result as $row) {
                                                                          $structureId = $row['id'];
                                                                          $structures[$structureId] = $this->buildDomainObject($row);
                                                                      }
                                                                      return $structures;
                                                                  }
                                                              	
                                                              
                                                                  public function rechercher($id) {
                                                              
                                                                      $sql = "SELECT * FROM structure where id=?";
                                                                      $row = $this->getDb()->fetchAssoc($sql, array($id));
                                                                      
                                                              		if ($row)
                                                                          return $this->buildDomainObject($row);
                                                                      else
                                                                          throw new \Exception("Aucune structure avec comme id :" . $id);
                                                              
                                                                  }
                                                              
                                                                  // Fonction d'ajout et de modification de structure
                                                                  public function enregistrer(Structure $structure) {
                                                                      $structureData = array(
                                                                          'nom' => $structure->getNom(),
                                                                          'sigle' => $structure->getSigle()
                                                                          );
                                                              
                                                                      if ($structure->getId()) {
                                                                          // La structure existe déjà : la mettre à jour
                                                                          $this->getDb()->update('structure', $structureData, array('id' => $structure->getId()));
                                                                      } else {
                                                                          // La structure n'a jamais été créée : l'enregistrer
                                                                          $this->getDb()->insert('structure', $structureData);
                                                                          // Obtenir l'id de la nouvelle structure créée et l'ajouter à l'entité.
                                                                          $id = $this->getDb()->lastInsertId();
                                                                          $structure->setId($id);
                                                                      }
                                                                  }
                                                              
                                                                  
                                                                  public function supprimer($id) {
                                                                      // Delete the article
                                                                      $this->getDb()->delete('structure', array('id' => $id));
                                                                  }
                                                              	
                                                                 
                                                                  protected function buildDomainObject(array $row) {
                                                                      $structure = new Structure();
                                                                      $structure->setId($row['id']);
                                                                      $structure->setNom($row['nom']);
                                                                      $structure->setSigle($row['sigle']);
                                                                      return $structure;
                                                                  }
                                                              }

                                                              En ce qui concerne le serviceProvider, je crois bien l'avoir enregistré car j'ai mis dans app/app.php :

                                                              $app->register(new Silex\Provider\FormServiceProvider());

                                                              Voilà ce que j'ai mis comme route (la route pour ajouter une filière) dans app/routes.php :

                                                              $app->match('/filiere/ajout', "MicroTest\Controller\HomeController::ajouterFiliereAction")
                                                              ->bind('ajouter_filiere');

                                                              Le contenu de HomeController::ajouterFiliereAction :

                                                              // Le controleur d'ajout de filière
                                                              public function ajouterFiliereAction(Request $request, Application $app) {
                                                              
                                                              $filiere = new Filiere();
                                                              $filiereForm = $app['form.factory']->create(FiliereType::class, $filiere);
                                                                      $filiereForm->handleRequest($request);
                                                              
                                                                      if ($filiereForm->isSubmitted() && $filiereForm->isValid()) {
                                                              
                                                                          $app['dao.filiere']->enregistrer($filiere);
                                                                          $app['session']->getFlashBag()->add('success', 'La filière a été ajoutée avec succès.');
                                                              			
                                                              			// Redirection vers la liste des filières
                                                              			return $app->redirect($app['url_generator']->generate('filiere'));
                                                              
                                                                      }
                                                              
                                                                      return $app['twig']->render('filiere_form.html.twig', array(
                                                              
                                                                          'title' => 'Ajouter une filière',
                                                                          'filiereForm' => $filiereForm->createView())
                                                              		);
                                                              
                                                                  }



                                                              Voici le contenu de ma vue :

                                                              {% extends "layout.html.twig" %}
                                                              {% if title starts with 'A' %}
                                                              	{% set ajoutFiliere = title %}
                                                              {% else %}
                                                              	{% set listeFiliere = title %}
                                                              {% endif %}
                                                              
                                                              {% block title %}{{ title }}{% endblock %}
                                                              
                                                              {% block content %}
                                                              	<div class="main-box">
                                                              		<div class="main-box-body clearfix">
                                                              			{% for flashMessage in app.session.flashbag.get('success') %}
                                                              				<div class="alert alert-success fade in">
                                                              					<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
                                                              					<i class="fa fa-check-circle fa-fw fa-lg"></i>
                                                              					<strong>Bien ! </strong>{{ flashMessage }}
                                                              				</div>
                                                              			{% endfor %}
                                                              			<h2 class="text-center">{{ block('title') }}</h2>
                                                              			{{ form_start(filiereForm, { 'attr': {'role': 'form'} }) }}
                                                              				<div class="form-group">
                                                              					{{ form_label(filiereForm.nom, null) }}
                                                              					
                                                              					{{ form_errors(filiereForm.nom) }}
                                                              					{{ form_widget(filiereForm.nom, { 'attr':  {
                                                              						'class': 'form-control',
                                                              						'placeholder': 'Nom'
                                                              					}}) }}
                                                              				</div>
                                                              				<div class="form-group">
                                                              					{{ form_label(filiereForm.structure, null) }}
                                                              					{{ form_errors(filiereForm.structure) }}
                                                              					{{ form_widget(filiereForm.structure, { 'attr':  {
                                                              						'class': 'form-control'
                                                              					}}) }}
                                                              				</div>
                                                              				<div class="form-group">
                                                              					{% if title starts with 'A' %}
                                                              						<input type="submit" class="btn btn-primary" value="Ajouter" />
                                                              					{% else %}
                                                              						<input type="submit" class="btn btn-primary" value="Modifier" />
                                                              					{% endif %}
                                                              				</div>
                                                              			{{ form_end(filiereForm) }}
                                                              		</div>
                                                              	</div>
                                                              {% endblock %}






                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Cours Architecture PHP professionnelle / Questions

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown