دورة SYMFONY 4 للمبتدئين الدرس التاسع


فهاد الدرس التاسع من دورة symfony 4 للمبتدئين غادي نكملوا الدورة ديالنا من بعد ما زدنا الفورم فالدرس السابق وشفنا كيفاش عرضناها فالملف الخاص بالإضافة دبا غادي نشوفوا كيفاش غادي نزيدو article فقاعدة البيانات بإستعمال الفورم.


1- إضافة الملف article لقاعدة البيانات

باش نزيد article غادي نحتاج ل class سميتها EntityManagerInterface ولي هي لي كتحكم فكل Entities لي عندي كنزيدها ف Top ديال الملف HelloController وأيضا فاش يتزاد article خصني ندير la redirection ل la page hello.html.twig وباش ندير هادشي كنخدم ب la classe RouterInterface.

فل constructeur كن créer l'objet  منهم كيف درت مع FormFactoryInterface من قبل.

الكود ديال HelloController بعد التعديل هو :

                                //
<?php

namespace App\Controller;
use App\Entity\Article;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use App\Form\ArticleType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Form\FormFactoryInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;

class HelloController extends AbstractController
{
    private $formFactory;
    private $entityManagerInterface;
    private $router;

    public function __construct(FormFactoryInterface $formFactory,
    EntityManagerInterface $entityManagerInterface,
    RouterInterface $router){
        $this->formFactory = $formFactory;
        $this->entityManagerInterface = $entityManagerInterface;
        $this->router = $router;
    }
    /**
    * @Route("/hello", name="hello")
    */
    public function index()
    {
        $repository = $this->getDoctrine()->getRepository(Article::class);
        $posts = $repository->findAll();

        return $this->render('hello.html.twig',[
            'posts' => $posts
        ]);
    }
    /**
     * @Route("/hello/show/{id}", name="article_show")
     */
    public function show($id){
        $repository = $this->getDoctrine()->getRepository(Article::class);
        $post = $repository->find($id);
        return $this->render('show.html.twig',['post'=>$post]);
    }
    /**
     * @Route("/hello/add", name="article_add")
     */
    public function add(Request $request){
        $article = new article();
        $form = $this->formFactory->create(ArticleType::class,$article);
        //get request
        $form->handleRequest($request);
        //check if form is valid
        if($form->isSubmitted() && $form->isValid()){
            
        }
        return $this->render('add.html.twig',[
            'form' => $form->createView()
        ]);
    }
}
                            

2- إضافة الملف article لقاعدة البيانات تتمة

من بعد فل fonction add فاش كنتحقق واش لفورم valid كنخدم كيف قلنا ب la classe EntityManagerInterface لي عندها ل fonction persist لي كتاخذ ل article لي غادي نزيدو منبعد مكيتزاد كنوجه المستخدم ل route hello لي هو الصفحة الرئيسية ديالنا.

الكود ديال HelloController بعد التعديل هو :

                                //
<?php

namespace App\Controller;
use App\Entity\Article;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use App\Form\ArticleType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Form\FormFactoryInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;

class HelloController extends AbstractController
{
    private $formFactory;
    private $entityManagerInterface;
    private $router;

    public function __construct(FormFactoryInterface $formFactory,
    EntityManagerInterface $entityManagerInterface,
    RouterInterface $router){
        $this->formFactory = $formFactory;
        $this->entityManagerInterface = $entityManagerInterface;
        $this->router = $router;
    }
    /**
    * @Route("/hello", name="hello")
    */
    public function index()
    {
        $repository = $this->getDoctrine()->getRepository(Article::class);
        $posts = $repository->findAll();

        return $this->render('hello.html.twig',[
            'posts' => $posts
        ]);
    }
    /**
     * @Route("/hello/show/{id}", name="article_show")
     */
    public function show($id){
        $repository = $this->getDoctrine()->getRepository(Article::class);
        $post = $repository->find($id);
        return $this->render('show.html.twig',['post'=>$post]);
    }
    /**
     * @Route("/hello/add", name="article_add")
     */
    public function add(Request $request){
        $article = new article();
        $form = $this->formFactory->create(ArticleType::class,$article);
        //get request
        $form->handleRequest($request);
        //check if form is valid
        if($form->isSubmitted() && $form->isValid()){
            //add data to database
            $this->entityManagerInterface->persist($article);
            $this->entityManagerInterface->flush();
            //redirect user to blog index
            return new RedirectResponse(
                $this->router->generate('hello')
            );  
        }
        return $this->render('add.html.twig',[
            'form' => $form->createView()
        ]);
    }
}
                            

3- إضافة رابط إضافة article فالصفحة الرئيسية

دبا يلا زدتي شي article غادي تلقاه فالصفحة الرئيسية لكن خصني نزيد رابط لي يديني لفورم إضافة article.

غادي نزيدوه فالوقت الحالي فالصفحة الرئيسية  لي هي  hello.html.twig هنا كنخدم ب les routes ولي يلا رجعتي ل HelloController غادي تلقى فوق كل fonction route خاص بها مع الرابط والإسم ديالو.

مثلا ل fonction add ال route ديالها سميتو article_add والرابط لي كيدي ليها هو hello/add/ إذن غادي نزيد رابط  فل href كنعطي ل path لي هي fonction كتاخد إسم route لي هو article_add دبا يلا ضغطت على الرابط غادي نتوجه مباشرة للفورم.



الكود ديال hello.html.twig بعد التعديل هو :

                                //
{% extends 'base.html.twig' %}
    {% block title %}Articles{% endblock %}
    {% block body %}
        <div class="row mt-4">
            <div class="col-md-6 mx-auto">
                <d3 class="card bg-light rounded">
                    <div class="container-fluid">
                        <h3 class="card-title text-default p-4">
                            Articles
                        </h3>
                        <hr>
                        <a href="{{path('article_add')}}" class="btn btn-outline-primary float-right text-primary">Ajouter</a>
                    </div>
                    <div class="card-body mt-2 rounded">
                        {% for post in posts %}
                            <div class="media">
                                <img class="mr-3 rounded" src="https://picsum.photos/100/100" alt="">
                                <div class="media-body">
                                    <h5 class="mt-0">{{post.title}}</h5>
                                    {{post.body}}
                                </div>
                            </div>
                            <hr>
                        {% endfor %}
                    </div>
                    </div>
                </div>
            </div>
        </div>
    {% endblock %}