Uczymy się tworzyć projekt w Symfony – popularnym frameworku w PHP, który będziemy stopniowo poznawać. Do dzieła.

Ok, na początku tworzymy projekt (w htdocs) komendą:

symfony new symfapp --version="7.1.*" --webapp

Później przechodzimy do folderu symfapp (najlepiej otwieramy przez VSCode) i używamy komendy:

symfony server:start

Jeżeli serwer działa to wychodzimy (ctrl c) i ustawiamy bazę danych (.env):

DATABASE_URL="mysql://user:password@127.0.0.1:3306/dbname?serverVersion=10.4.32-MariaDB&charset=utf8mb4"

Oczywiście jeżeli mamy inny port, inną wersję serwera, inny rodzaj sqla albo cokolwiek, to wpisujemy własne. Nie możemy natomiast tego olać, bo później mogą być nieoczekiwane błędy.

Tylko nazwa bazy danych może być nieistniejąca, stworzymy ją sobie komendą:

symfony console doctrine:database:create

Warto jeszcze doinstalować pewne paczki:

composer require --dev orm-fixtures;
composer require symfony/form;

Zawsze warto też przetestować, czy migracje działają. Wpisujemy komendę:

symfony console make:entity

Poprosi nas o nazwę entity. Wpisujemy:

  • MicroPost, enter
  • Poprosi o głupoty związane z paczką, której nie mamy (dajemy no)
  • Poprosi o nazwę pola, wpisujemy title
    • Poprosi o typ pola, wpisujemy string (możemy dać ? aby zobaczyć dostępne)
    • Poprosi o limit, 255
    • Poprosi o to, czy może być nullable, dajemy no
  • Zapyta, czy dodać kolejne pole, wpisujemy content
    • Poprosi o typ pola, piszemy text
    • Zapyta, czy nullable, dajemy no
  • Zapyta czy dodać kolejne pole, dajemy enter, aby wyjść

Ok, teraz wykonamy komendę:

symfony console make:migration

Symfony to świetne narzędzie, które może nas nauczyć tworzenia baz danych, własnych tabel w bazach danych. Przejdźmy do migrations:

final class Version20240819065842 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->addSql('CREATE TABLE micro_post (id INT AUTO_INCREMENT NOT NULL, title VARCHAR(255) NOT NULL, content LONGTEXT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
        $this->addSql('CREATE TABLE messenger_messages (id BIGINT AUTO_INCREMENT NOT NULL, body LONGTEXT NOT NULL, headers LONGTEXT NOT NULL, queue_name VARCHAR(190) NOT NULL, created_at DATETIME NOT NULL COMMENT \'(DC2Type:datetime_immutable)\', available_at DATETIME NOT NULL COMMENT \'(DC2Type:datetime_immutable)\', delivered_at DATETIME DEFAULT NULL COMMENT \'(DC2Type:datetime_immutable)\', INDEX IDX_75EA56E0FB7336F0 (queue_name), INDEX IDX_75EA56E0E3BD61CE (available_at), INDEX IDX_75EA56E016BA31DB (delivered_at), 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->addSql('DROP TABLE micro_post');
        $this->addSql('DROP TABLE messenger_messages');
    }
}

Widzimy tu czysty SQL, jaki będzie użyty. Raz jeszcze, zobaczmy:

CREATE TABLE micro_post 
(id INT AUTO_INCREMENT NOT NULL, 
title VARCHAR(255) NOT NULL, 
content LONGTEXT NOT NULL, 
PRIMARY KEY(id))
DEFAULT CHARACTER SET utf8mb4
COLLATE `utf8mb4_unicode_ci` 
ENGINE = InnoDB

Jeżeli nie wiemy, jaki kod sql napisać do stworzenia jakiejś tabeli to zawsze można odpalić symfony, stworzyć szybko entity przez symfony console make:entity, następnie wygenerować migrację i skopiować ten kod do projektu, gdzie używamy czystego SQL.

Ok, ale wracając do symfony, migrujemy:

symfony console doctrine:migrations:migrate

Na razie nie musimy wszystkiego rozumieć, ważne że ta komenda wywoła się bez problemu i utworzy tabelę w bazie. Jeżeli coś nie działa sprawdźmy, czy podaliśmy dobrą wersję serwera w DATABASE_URL.