BLOG ب SYMFONY 4 الجزء الثاني


فهاد الجزء الثاني من BLOG ب SYMFONY 4 غادي نكملو ل projet ديالنا وغادي نزيدو أول controller ديالنا ولي غادي يمكنا من عرض les articles لي عندنا فقاعدة البيانات.

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

1- إضافة الملف BlogController

فغادي نزيد أول controller غادي ندير هاد ل commande :

php bin/console make:controller BlogController

فهنا ل controller سميناه BlogController غادي تمشي ل dossier Controller غادي تلقاه تزاد تما.

منبعد غادي نزيد فيه fonction index لي كنسترجع بها les articles من قاعدة البيانات وكنرسلهم للملف index.html.twig لي غادي نزيدوه من بعد.

ثم ل fonction show لي كنسترجع بها article ب slug ديالو وكنرسلو للملف show.html.twig لي غادي نزيدوه من بعد.

ثم ل fonction renderUserPosts لي كتاخد مستخدم وكتسترجع les articles الخاصين به وكترسلهم للملف user_posts.html.twig لي غادي نزيدوه من بعد.

ثم ل fonction searchPosts لي كنسترجع بها les articles لي بحث عليهم المستخدم وكنرسلهم للملف index.html.twig لي غادي نزيدوه من بعد.

الكود ديال BlogController.php هو : 

                                //BlogController.php

<?php

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

class BlogController extends Controller
{
    /**
     * @Route("/", name="blog")
     */
    public function index()
    {

		$posts = $this->getDoctrine()
				  ->getRepository(Post::class)
				  ->findBy([],['time' => 'DESC']);
        
        $latests = $this->getDoctrine()
                      ->getRepository(Post::class)
                      ->getLatest();

        return $this->render('blog/index.html.twig', [
            'posts' => $posts,
            'latests' => $latests,
        ]);
    }
    /**
     * @Route("/blog/{slug}", name="blog_show")
    */
    public function show($slug)
    {
        $post = $this->getDoctrine()
                      ->getRepository(Post::class)
                      ->findOneBy(['slug'=>$slug]);

        $latests = $this->getDoctrine()
                      ->getRepository(Post::class)
                      ->getLatest();

        return $this->render('blog/show.html.twig', [
            'post' => $post,
            'latests' => $latests,
        ]);
    }
    /**
     * @Route("/user/{username}", name="user_posts")
    */
    public function renderUserPosts(User $userPosts)
    {
        $posts = $this->getDoctrine()
                      ->getRepository(Post::class)
                      ->findBy(['user'=>$userPosts],['time'=>'DESC']);

        return $this->render('users/user_posts.html.twig', [
            'posts' => $posts,
            'user' => $userPosts
        ]);
    }

    /**
     * @Route("/blog/posts/search", name="search_posts")
    */
    public function searchPosts(Request $request)
    {
        $posts = $this->getDoctrine()
                      ->getRepository(Post::class)
                      ->searchPosts($request->request->get('search'));

                      
        $latests = $this->getDoctrine()
                      ->getRepository(Post::class)
                      ->getLatest();

        return $this->render('blog/index.html.twig', [
            'posts' => $posts,
            'latests' => $latests,
        ]);
    }
}
                            

2- تعديل الملف PostRepository.php

غادي تمشي ل dossier Repository غادي تلقى لملف PostRepository غادي نديرو عليه تعديلات.

كيف شفتي فل controller زدنا des fonctions لي هما getLatest لي كنسترجعوا بهم آخر متزاد ف les articles وكنسترجع 5 وعندي أيضا ل fonction searchPosts لي كنبحث بها على les articles لي العنوان ديالهم بحال الكلمة لي دخل المستخدم فالحقل ديال البحث.

هاد les fonctions غادي نزيدوهم فهاد الملف الكود ديالو بعد التعديل هو :

                                //
<?php

namespace App\Repository;

use App\Entity\Post;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Symfony\Bridge\Doctrine\RegistryInterface;
use Doctrine\Common\Collections\Collection;

/**
 * @method Post|null find($id, $lockMode = null, $lockVersion = null)
 * @method Post|null findOneBy(array $criteria, array $orderBy = null)
 * @method Post[]    findAll()
 * @method Post[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */
class PostRepository extends ServiceEntityRepository
{
    public function __construct(RegistryInterface $registry)
    {
        parent::__construct($registry, Post::class);
    }

    // /**
    //  * @return Post[] Returns an array of Post objects
    //  */
    /*
    public function findByExampleField($value)
    {
        return $this->createQueryBuilder('p')
            ->andWhere('p.exampleField = :val')
            ->setParameter('val', $value)
            ->orderBy('p.id', 'ASC')
            ->setMaxResults(10)
            ->getQuery()
            ->getResult()
        ;
    }
    */

    /*
    public function findOneBySomeField($value): ?Post
    {
        return $this->createQueryBuilder('p')
            ->andWhere('p.exampleField = :val')
            ->setParameter('val', $value)
            ->getQuery()
            ->getOneOrNullResult()
        ;
    }
    */
    public function searchPosts($title)
    {
        $query = $this->createQueryBuilder('p');
        return $query->select('p')
            ->where('p.title LIKE :val')
            ->setParameter('val', '%'.$title.'%')
            ->orderBy('p.time','DESC')
            ->getQuery()
            ->getResult()
        ;
    }
    public function getLatest()
    {
        return $this->createQueryBuilder('p')->select('p')
            ->setMaxResults(5)
            ->orderBy('p.time','DESC')
            ->getQuery()
            ->getResult()
        ;
    }
}
                            

3- إضافة ل Entity User.php

باش نزيد table ديال ل users غادي نزيدو Entity جديدة غادي تدير ل commande :

php bin/console make:entity 

سميها User منبعد متزاد غادي نزيدو فيها الكود لي فيه الحقول لي فيها بالإضافة ل les relations مع ل posts & comments وبالنسبة ل postsLiked غادي نشوفوها من بعد.

الكود ديال الملف 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\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @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
{
    const ROLE_USER = 'ROLE_USER';
    const ROLE_ADMIN = 'ROLE_ADMIN';
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     *@ORM\Column(type="string", length=191,unique=true)
     *@Assert\NotBlank()
     *@Assert\Length(min=5,max=50,minMessage="Le pseudo doit avoir au moins 5 caractéres")
     */
    private $username;

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

    /**
     * @ORM\Column(type="string", length=191,unique=true)
     * @Assert\NotBlank()
     * @Assert\Length(min=5,max=50,minMessage="Veuillez saisir une adresse email valide")
    */
    private $email;

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

    /**
     * @ORM\Column(type="simple_array")
     */
    private $roles = [];


    /**
     * @Assert\NotBlank()
     * @Assert\Length(min=5,max=4096,minMessage="Le mot de passe doit avoir au moins 5 caractéres")
    */
    private $plainPassword;

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

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


    /**
    * @ORM\ManyToMany(targetEntity="App\Entity\Post",mappedBy="likedBy")
    */
    private $postsLiked;


    public function __construct(){
        $this->posts = new ArrayCollection();
        $this->postsLiked = new ArrayCollection();
        $this->comments = 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 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 getPlainPassword(): ?string
    {
        return $this->plainPassword;
    }

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

        return $this;
    }


    public function getRoles(): ?array
    {
        return $this->roles;
    }

    public function setRoles(array $roles): self
    {
        $this->roles = $roles;

        return $this;
    }
    public function getSalt()
    {
        return null;
    }
    public function eraseCredentials()
    {
        return null;
    }
    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 getPosts()
    {
        return $this->posts;
    }
    public function getComments()
    {
        return $this->comments;
    }
    public function getPostsLiked()
    {
        return $this->getPostsLiked;
    }

}
                            

3- إضافة ل user migration

فباش نزيد لUser Entity فقاعدة البيانات خصني نزيد 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 Version20190311160744 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 user (id INT AUTO_INCREMENT NOT NULL, username VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, fullname VARCHAR(255) NOT NULL, roles LONGTEXT NOT NULL COMMENT \'(DC2Type:simple_array)\', PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB');
    }

    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 user');
    }
}
                                

4- إضافة مستخدم عشوائي فقاعدة البيانات

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

php bin/console doctrine:migrations:migrate

منبعد غادي تمشي لقاعدة البيانات غادي تلقى table user تزادت.

دبا غادي نزيدو معلومات عشوائية ف la table user باش ندير هادشي غادي نخدم بل fixtures.

 غادي نزيد fixture جديدة سميها UserFixture غادي تدير هاد ل commande :

 php bin/console make:fixtures   

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

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

 php bin/console doctrine:fixtures:load

 الكود ديال الملف UserFixture هو :

                                    //
<?php

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


class UserFixture extends Fixture
{   
    
    private $passwordEncoder;

    public function __construct(UserPasswordEncoderInterface $passwordEncoder){
        $this->passwordEncoder = $passwordEncoder;
    }

    public function load(ObjectManager $manager)
    {
        $user = new User();
        $user->setUsername('samadi2019');
        $user->setFullname('samadi samir');
        $user->setEmail('samadi@email.com');
        $user->setPassword(
            $this->passwordEncoder->encodePassword(
                $user,'samadi123'
            )
        );
        $user->setRoles(['ROLE_USER']);
        $manager->persist($user);
        $manager->flush();

    }
}
                                


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

بحث في الموقع


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