BLOG ب SYMFONY الجزء السادس


فهاد الجزء السادس من Blog ب symfony 4 غادي نكملوا ل projet ديالنا وغادي نزيدو إمكانية إضافة التعليقات على كل article تزاد مع عرض التعليقات الخاصة بكل تعليق على حدة.

نظرة سريعة بالفيديو

1- إضافة Comment TABLE

باش نزيد table comment غادي نزيدو Entity لي غادي نسميوها Comment فغادي تدير هاد ل commande :

php bin/console make:migration


منبعد غادي تمشي ل dossier Entity غادي تلقى الملف Comment.php تزاد فيه غادي يكونوا عندي الحقول لي غادي تاخدهم table comment.

وعندي أيضا العلاقات مع ل user & post لي كيمكنني نسترجع التعليقات الخاصين ب كل post.

الكود ديال الملف Comment.php هو :

                                //
<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\CommentRepository")
 */
class Comment
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="text")
     */
    private $body;

    /**
     * @ORM\Column(type="datetime")
     */
    private $created;


    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User",inversedBy="comments")
     * @ORM\JoinColumn()
    */
    private $user;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Post",inversedBy="posts")
     * @ORM\JoinColumn()
    */
    private $post;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getBody(): ?string
    {
        return $this->body;
    }

    public function setBody(string $body): self
    {
        $this->body = $body;

        return $this;
    }

    public function getCreated(): ?\DateTimeInterface
    {
        return $this->created;
    }

    public function setCreated(\DateTimeInterface $created): self
    {
        $this->created = $created;

        return $this;
    }
    public function getUser()
    {
        return $this->user;
    }

    public function setUser($user): self
    {
        $this->user = $user;

        return $this;
    }
    public function getPost()
    {
        return $this->post;
    }

    public function setPost($post): self
    {
        $this->post = $post;

        return $this;
    }
}
                            

2- إضافة ل MIGRATION

فباش نزيد ل  Entity Comment فقاعدة البيانات خصني نزيد migration فغادي ندير هاد ل commande :

php bin/console make:migration  

منبعد غادي تمشي ل dossier Migrations غادي تلقاها تزادت تما فيها غادي تلقا هاد الكود :

                                //
<?php

declare(strict_types=1);

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

/**
 * Auto-generated Migration: Please modify to your needs!
 */
final class Version20190316122015 extends AbstractMigration
{
    public function getDescription() : string
    {
        return '';
    }

    public function up(Schema $schema) : void
    {
        // this up() migration is auto-generated, please modify it to your needs
        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');

        $this->addSql('CREATE TABLE comment (id INT AUTO_INCREMENT NOT NULL, user_id INT DEFAULT NULL, post_id INT DEFAULT NULL, body LONGTEXT NOT NULL, created DATETIME NOT NULL, INDEX IDX_9474526CA76ED395 (user_id), INDEX IDX_9474526C4B89032C (post_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB');
        $this->addSql('ALTER TABLE comment ADD CONSTRAINT FK_9474526CA76ED395 FOREIGN KEY (user_id) REFERENCES user (id)');
        $this->addSql('ALTER TABLE comment ADD CONSTRAINT FK_9474526C4B89032C FOREIGN KEY (post_id) REFERENCES post (id)');
    }

    public function down(Schema $schema) : void
    {
        // this down() migration is auto-generated, please modify it to your needs
        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');

        $this->addSql('DROP TABLE comment');
    }
}
                            

3- إضافة الملف CommentController

كيف شفنا زدنا ل migration باش نرسلها وتزاد ك table فقاعدة البيانات غادي ندير هاد ل commande :

php bin/console doctrine:migrations:migrate  

منبعد غادي نزيد ل controller CommentController بهاد ل commande :

php bin/console make:controller CommentController 

منبعد غادي تمشي ل dossier Controller غادي تلقاه تزاد تما.

فيه غادي تكون عندي ل fonction add لي كتسترجع ل post بل id ديالو ولي غادي يجيني مع لفورم وكنسترجع حتى لمستخدم لي مكونيكطي وكنزيد التعليق ونرد المستخدم لل post.

الكود ديال الملف CommentController.php هو : 


                                //
<?php

namespace App\Controller;
use App\Entity\User;
use App\Entity\Post;
use App\Entity\Comment;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;

class CommentController extends Controller
{
    /**
     * @Route("/comment/add", name="comment_add")
     */
    public function add(Request $request)
    {
        $post_id = $request->request->get('post_id');

        $user = $this->getUser();

        $post = $this->getDoctrine()
                ->getRepository(Post::class)
                ->find($post_id);

        $comment = new Comment();
        $comment->setBody($request->request->get('_comment'));
        $comment->setUser($user);
        $comment->setPost($post);
        $comment->setCreated(new \DateTime());

        $entityManager = $this->getDoctrine()->getManager();

        $entityManager->persist($comment);
        $entityManager->flush();

        $post_slug = $post->getSlug();

        return $this->redirectToRoute('blog_show',[
            'slug' =>  $post_slug
        ]);
    }
}
                            

4- إضافة الفورم الخاصة بإضافة تعليق

غادي نرجع للملف show.html.twig لي كيعرض المعلومات الخاصة ب post ختاريناه وكنزيد عليه تعديلات.

كنزيد الفورم ديال إضافة تعليق ولي كتظهر فقط  يلا كان المستخدم مكونيكطي مكانش كيظهر رابط لي كيديه لتسجيل الدخول.

وكنزيد أيضا الكود لي كنعرض به التعليقات الخاصين بهاد ل post ولي كنسترجعهم بالعلاقة لي درت بين ل post ول comment ولي كتمكني من عرضهم.

الكود ديال الملف show.html.twig  بعد التعديل هو :

                                    //
{% extends 'base.html.twig' %}

{% block title %}{{post.title}}{% endblock %}

{% block body %}
    <article class="col-sm-7 mt-4 mx-4">
        <div class="row post mb-1">
            <div class="col-12">
                <h2 class="text-capitalize">{{post.title}}</h2>
                <p class="added">{{post.user.fullname}} {{post.time|date("F jS \\a\\t g:ia")}}</p>
                <p>{{post.body}}</p>
            </div>
        </div>
        <div class="row post mt-2">
            <div class="col-12">
                <h2 class="text-capitalize">Commentaires <span class="badge badge-dark">{{post.getComments.count}}</span></h2>
                <hr>
                {% if is_granted('ROLE_USER') %}
                <form action="{{path('comment_add')}}" method="post">
                    <div>
                        <div class="form-group">
                            <textarea type="text" placeholder="Ajouter votre commentaire" rows="5" cols="20" name="_comment" id="comment" required class="form-control"></textarea>
                        </div>
                        <div class="form-group">
                            <button class="btn btn-primary" id="login" name="login">
                                Valider
                            </button>
                        </div>
                        <input type="hidden" name="_csrf_token" value="{{csrf_token('authenticate')}}">
                        <input type="hidden" name="post_id" value="{{post.id}}">
                    </div>
                </form>
                <hr>
                {% else %}
                    <a href="{{path('security_login')}}" class="btn btn-link">Connectez vous pour commenter</a>
                {% endif %}
                <!-- show comments -->
                {% for comment in post.getComments %}
                <div class="media mt-3">
                    <div class="media-body">
                        <span class="comment-username">{{comment.user.username}} {{comment.created|date("F jS \\a\\t g:ia")}}</span>
                        <p class="comment mt-2">{{comment.body}}</p>
                    </div>
                    <hr>
                </div>
                {% endfor %}
            </div>
        </div>
    </article>
    <aside class="col-sm-4 container col-12">
          {{include('includes/sidebar.html.twig',{'latests':latests})}}
    </aside>
{% endblock %}
                                


إشترك في قناتنا على اليوتيوب

بحث في الموقع


إشترك للتوصل بالجديد