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

منذ 5 سنوات imadbelasri Symfony
SY

فهاد الدرس السادس عشر من دورة SYMFONY 4 للمبتدئين غادي نشوفوا كيفاش نديرو العلاقة مابين المستخدم ول article  باش فاش يزيد المستخدم مقال جديد يكون عندنا ف table article ل id ديالو وبالتالي فاش نعرض les articles نعرض معاهم حتى إسم المستخدم لي زادهم.


1- إضافة ل user ل Entity Article

ف Article.php كنزيد variable user لي فوقها عندي la relation لي سميتها ManyToOne لي كتعني المستخدم عندو article أو بزاف ديال les articles وكنعطي أيض ل Entity لي عندها معها لعلاقة ولي حددناها ف User.

كنزيد أيضا ل fonction get & set ديال ل user.

الكود ديال Article.php بعد التعديل هو :

                                                    
                                                        //
<?php

namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;

/**
 * Powma\ServiceBundle\Entity\Article
 *
 * @ORM\Entity
 * @ORM\Table(name="article")
 */

class Article
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string",length=280)
     * @Assert\NotBlank()
     * @Assert\Length(min=10,minMessage="Le champ doit avoir au moins 10 caractéres")
     */
    private $title;

    /**
     * @ORM\Column(type="text")
     * @Assert\NotBlank()
     * @Assert\Length(min=10,minMessage="Le champ doit avoir au moins 10 caractéres")     
     */
    private $body;

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

    public function getId(){
        return $this->id;
    }
    //we dont need set function for id
    public function getTitle(){
        return $this->title;
    }
    
    public function getBody(){
        return $this->body;
    }
    
    public function setTitle($title) : void {
        $this->title = $title;
    }

    public function setBody($body) : void {
        $this->body = $body;
    }
    public function getUser()
    {
        return $this->user;
    }

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

        return $this;
    }
}
                                                    
                                                

2- إضافة ل articles ل Entity User

ف User.php كنزيد variable articles لي فوقها عندي la relation لي سميتها OneToMany لي كتعني ال article تابع لمستخدم واحد وكنعطي أيض ل Entity لي عندها معها لعلاقة ولي حددناها ف Article.

كنزيد أيضا فل constructeur ل instanciation ديال ل variable articles لي كنعطيها ArrayCollection حيت les articles غادي يكونوا على شكل array.

الكود ديال User.php بعد التعديل هو :

                                                        
                                                            //
<?php

namespace App\Entity;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;


/**
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @UniqueEntity(fields="email",message="cet email est déja utilisé!")
 * @UniqueEntity(fields="username",message="ce pseudo est déja utilisé!")
 */
class User implements UserInterface,\Serializable
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=50,unique=true)
     * @Assert\NotBlank()
     * @Assert\Length(min=5,max=50)
     */
    private $username;

    /**
     * @ORM\Column(type="string", length=191)
     */
    private $password;

     /**
     * @Assert\NotBlank()
     * @Assert\Length(min=5,max=4096)
     */
    private $plainPassword;

    /**
     * @Assert\NotBlank()
     * @ORM\Column(type="string", length=191 ,unique=true)
     * @Assert\Email()
     */
    private $email;

    /**
     * @Assert\NotBlank()
     * @ORM\Column(type="string", length=191)
     * @Assert\Length(min=5,max=50)
     */
    private $fullname;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Article",mappedBy="user")
     */
    private $articles;


    public function __construct(){
        $this->articles = new ArrayCollection();
    }

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

    public function getUsername(): ?string
    {
        return $this->username;
    }

    public function setUsername(string $username): self
    {
        $this->username = $username;

        return $this;
    }
    public function getPlainPassword(): ?string
    {
        return $this->plainPassword;
    }

    public function setPlainPassword(string $plainPassword): self
    {
        $this->plainPassword = $plainPassword;

        return $this;
    }

    public function getPassword(): ?string
    {
        return $this->password;
    }

    public function setPassword(string $password): self
    {
        $this->password = $password;

        return $this;
    }

    public function getEmail(): ?string
    {
        return $this->email;
    }

    public function setEmail(string $email): self
    {
        $this->email = $email;

        return $this;
    }

    public function getFullname(): ?string
    {
        return $this->fullname;
    }

    public function setFullname(string $fullname): self
    {
        $this->fullname = $fullname;

        return $this;
    }
    public function getSalt()
    {
        return null;
    }
    public function eraseCredentials()
    {
        return null;
    }
    public function getRoles()
    {
        return ['ROLE_USER'];
    }
    public function serialize()
    {
        return serialize(array(
            $this->id,
            $this->username,
            $this->password,
        ));
    }
    public function unserialize($serialized)
    {
        list (
            $this->id,
            $this->username,
            $this->password,
        ) = unserialize($serialized);
    }
    public function getArticles()
    {
        return $this->articles;
    }
}
                                                        
                                                    

3- إضافة ل user_id ل table article

باش نزيد ل user_id ل table article غادي نمشي ل cmd ونزيد migration جديدة بل commande :

php bin/console doctrine:migrations:diff

منبعد ميتزاد غادي تمشي ل dossier migrations غادي تلقى ل migration تزادت لي فيها لكود لي لتحت من بعد غادي ترسلها لقاعدة البيانات بل commande :

php bin/console doctrine:migrations:migrate

دبا يلا مشيتي لقاعدة البيانات ف table article غادي تلقى الحقل user_id تزاد.

                                                        
                                                            //
<?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 Version20190212114139 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('ALTER TABLE article ADD user_id INT DEFAULT NULL');
        $this->addSql('ALTER TABLE article ADD CONSTRAINT FK_23A0E66A76ED395 FOREIGN KEY (user_id) REFERENCES user (id)');
        $this->addSql('CREATE INDEX IDX_23A0E66A76ED395 ON article (user_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('ALTER TABLE article DROP FOREIGN KEY FK_23A0E66A76ED395');
        $this->addSql('DROP INDEX IDX_23A0E66A76ED395 ON article');
        $this->addSql('ALTER TABLE article DROP user_id');
    }
}
                                                        
                                                    

4- إضافة معلومات عشوائية ف table article

دبا غادي نعاودو نزيدو des articles جداد مع ل user id غادي تمشي ل dossier DataFixtures غادي ت commenter داكشي لي ف ArticleFixture و UserFixture.


منبعد غادي تمشي للملف AppFixtures غادي نزيدو جوج ديال les fonctions كاين loadUsers لي غادي تمكن من إضافة مستخدم جديد هادشي سبق شفناه الجديد هنايا هو ل fonction addReference لي كنحدد بها المستخدم لي غادي نزيدو ل les articles منبعد.
كاين أيضا loadArticles لي كنزيد بها les articles وكنخدم ب setUser لي سبق وزدناها وكنخدم ب getReference لي كتمكن من إسترجاع المستخدم لي حددناه ف setReference.

منبعد غادي نصيفطوا المعلومات لقاعدة البيانات بل commande :

php bin/console doctrine:fixtures:load
 
الكود ديال AppFixtures.php هو :

                                                        
                                                            //
<?php

namespace App\DataFixtures;
use App\Entity\Article;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;
use App\Entity\User;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

class AppFixtures extends Fixture
{
    private $passwordEncoder;
    public function __construct(UserPasswordEncoderInterface $passwordEncoder){
        $this->passwordEncoder = $passwordEncoder;
    }
    public function load(ObjectManager $manager)
    {
        $this->loadUsers($manager);
        $this->loadArticles($manager);
    }
    public function loadArticles(ObjectManager $manager)
    {
        for($i=0;$i<10;$i++){
            
            $article = new Article();
            $article->setTitle('this my first article '.rand(0,100));
            $article->setBody('this my first body '.rand(0,100));
            $article->setUser($this->getReference('tazi2014'));
            $manager->persist($article);

        }
        $manager->flush();
    }
    public function loadUsers(ObjectManager $manager)
    {
        $user = new User();
        $user->setUsername('imad2019');
        $user->setFullname('imad tazi');
        $user->setEmail('tazi@email.com');
        $user->setPassword(
            $this->passwordEncoder->encodePassword(
                $user,'tazi2014'
            )
        );
        $this->addReference('tazi2014',$user);
        $manager->persist($user);

        $manager->flush();
    }
}
                                                        
                                                    

5-عرض les articles بأسماء المستخدمين

منبعد مازدنا les articles مع ل id ديال المستخدم غادي نمشي للصفحة الرئيسية وندير تعديل باش نعرض الإسم ديال المستخدم لي زاد كل article.

الطريقة سهلة حيت سبق درنا la relation مع ل User كندير post.user.fullname وكنحصل على المستخدم كيف كنشوف فالصورة :



الكود ديال 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">
                {% for message in app.flashes('notice') %}
                    <div class="alert alert-success">
                        {{message}}
                    </div>
                {% endfor %}    
                <div 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">
                                    <span>{{post.user.fullname}}</span>
                                    <h5 class="mt-0">{{post.title}}</h5>
                                    {{post.body}}
                                </div>
                                <a href="{{path('article_edit',{'id':post.id})}}" class="btn btn-outline-warning btn-sm float-right text-warning  mr-2">Modifier</a>
                                <a href="{{path('article_delete',{'id':post.id})}}" class="btn btn-outline-danger btn-sm  float-right text-danger">Supprimer</a>
                            </div>
                            <hr>
                        {% endfor %}
                    </div>
                    </div>
                </div>
            </div>
        </div>
    {% endblock %}
                                                        
                                                    

دروس ذات صلة

SY

دورة symfony 4 للمبتدئين الدرس الأول

فهاد الدورة الجديدة ولي غادي نخصصوها ل symfony 4 بناءا على الطلب ديال العديد من الزوار ديال الموقع غ...


SY

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

فهاد الدرس الثاني من دورة SYMFONY 4 للمبتدئين غادي نكملوا الدورة ديالنا من بعد ماشفنا كيفاش نزي...


SY

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

فهاد الدرس الثالت من دورة symfony 4 للمبتدئين غادي نشوفوا البنية ديال واحد ل page twig وكيفاش symfon...


SY

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

فهاد الدرس الرابع من دورة SYMFONY 4 للمبتدئين غادي نكملوا الدورة ديالنا وغادي نشوفوا كيفاش نعرضوا مج...


SY

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

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


SY

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

فهاد الدرس السادس من دورة SYMFONY 4 للمبتدئين غادي نكملوا الدورة ديالنا منبعد ما زدنا قاعدة البيانات...


SY

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

فهاد الدرس السابع من دورة SYMFONY 4 للمبتدئين غادي نكملوا الدورة ديالنا منبعد مازدنا les articl...


SY

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

فهاد الدرس الثامن من دورة symfony للمبتدئين غادي نكملو الدورة ديالنا منبعد مشفنا كيفاش زدنا المعلوما...


SY

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

فهاد الدرس التاسع من دورة symfony 4 للمبتدئين غادي نكملوا الدورة ديالنا من بعد ما زدنا الفورم فالدرس...


SY

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

فهاد الدرس التاسع من دورة symfony 4 للمبتدئين غادي نكملوا الدورة ديالنا وغادي نشوفوا كيفاش نديرو الت...