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


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


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

أول حاجة قبل ما نزيدو قاعدة البيانات ف symfony معندهاش إتصال مباشر مع قواعد البيانات هي كتستعمل واحد لمكتبة سميتها Doctrine  هي لي كتمكنها من التعامل مع قواعد البيانات.

فخصنا نزيدو هاد المكتبة باش تزيدها غادي تفتح ل projet ديالك ف cmd من بعد غادي تدير هاد les commandes :

composer require symfony/orm-pack 
composer require symfony/maker-bundle --dev

منبعد غادي تمشي للملف env. لي كاين ف dossier projet ف DATABASE_URL لي هي ل variable de connexion غادي تزيد إسم المستخدم لي عندي انا هو root ويلا كنتي داير كلمة مرور ل phpmyadmin كتبها مكنتيش خليها خاوية هكا ' ' وفالأخير كنزيد إسم قاعدة البيانات لي هنا سميتها blog.

الكود ديال الملف env. بعد التعديل هو :

                                //
# In all environments, the following files are loaded if they exist,
# the later taking precedence over the former:
#
#  * .env                contains default values for the environment variables needed by the app
#  * .env.local          uncommitted file with local overrides
#  * .env.$APP_ENV       committed environment-specific defaults
#  * .env.$APP_ENV.local uncommitted environment-specific overrides
#
# Real environment variables win over .env files.
#
# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES.
#
# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2).
# https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration

###> symfony/framework-bundle ###
APP_ENV=dev
APP_SECRET=1e8eac36868791190caf47d5879d4d68
#TRUSTED_PROXIES=127.0.0.1,127.0.0.2
#TRUSTED_HOSTS='^localhost|example\.com$'
###< symfony/framework-bundle ###

###> doctrine/doctrine-bundle ###
# Format described at http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
# For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db"
# Configure your db driver and server_version in config/packages/doctrine.yaml
DATABASE_URL=mysql://root:''@127.0.0.1:3306/blog
###< doctrine/doctrine-bundle ###

###> symfony/swiftmailer-bundle ###
# For Gmail as a transport, use: "gmail://username:password@localhost"
# For a generic SMTP server, use: "smtp://localhost:25?encryption=&auth_mode="
# Delivery is disabled by default via "null://localhost"
MAILER_URL=null://localhost
###< symfony/swiftmailer-bundle ###
                            

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

دبا وخا زدنا المعلومات الخاصة بقاعدة البيانات فالملف env. مازال متزادت عندنا باش نزيدها غادي تنفذ هاد ال commande لي كتمكن من إضافتها :

                                //
php bin/console doctrine:database:create
                            

3- إضافة أول Entity

دبا يلا مشيتي ل phpmyadmin غادي تلقى قاعدة بيانات سميتها blog تزادت منبعد خصنا نزيدو des tables فيها وباش نزيد كل table خصني نزيد des classes لي ف symfony كنسميوهم Entity أو Model ف laravel يلا سبقلك خدمتي بها.

فل Entity كيكون عندي الحقول كاملين لي غادي يكونوا ف table غادي تمشي ل dossier src/Entity تما غادي تزيد fichier جديد سميه Article.php لي غادي يمكنا من إضافة table article.

داخل هاد ل Entity كنحدد الحقول لي حددتهم ف id title & body ولي عطيت type ديالهم وزدت أيضا ل getters و setters لي هما des fonctions لي كيمكنوا من إسترجاع وتعديل هاد الحقول.

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

                                <?php

namespace App\Entity;

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)
     */
    private $title;

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

    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;
    }
}
                            

4- إضافة اول table لقاعدة البيانات

دبا زدنا ل Entity Article لكن مزال الكود باش ن créer table article معنديش باش ن générer هاد الكود كندير هاد ل commande :

php bin/console make:migration

لي كتمكني باش نحصل على ل migration لي غادي يكون فيها لكود باش نزيد table ديالي فقاعدة البيانات.

دبا يلا مشيتي ل dossier src/Migrations غادي تلقى fichier جديد فيه ل migration ديال 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 Version20190201193034 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 article (id INT AUTO_INCREMENT NOT NULL, title VARCHAR(280) NOT NULL, body LONGTEXT NOT NULL, 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 article');
    }
}
                                

5- إضافة اول table لقاعدة البيانات تتمة

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


ال commande هي :

                                    //
 php bin/console doctrine:migrations:migrate