دورة SYMFONY 4 للمبتدئين الدرس السادس عشر
1- إضافة ل user ل Entity Article
//
<?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
//
<?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
//
<?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
//
<?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 بأسماء المستخدمين
//
{% 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 %}