Vieux site :
https://web.archive.org/web/20200301161335/https://listphp.webdev-cf2m.be/
Versions :
- Symfony 7.2.2
- PHP 8.3.14
- MariaDB 11.5.2
Pour mettre à jour la version de MariaDB en utf8mb4_general_ci
, il faut d'abord arrêter le service MariaDB et ajouter dans son fichier de configuration my.ini
les lignes suivantes :
[mysqld]
port=3307
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
Ensuite, on redémarre le service MariaDB.
Le fichier .env.dev
doit être mis à jour avec le port de MariaDB :
###> doctrine/doctrine-bundle ###
DATABASE_URL="mysql://root:@127.0.0.1:3307/fphp8?serverVersion=11.5.2-MariaDB&charset=utf8mb4"
###< doctrine/doctrine-bundle ###
On crée la base de données pour vérifier que les modifications ont bien été prises en compte, voir .env.dev
:
php bin/console doctrine:database:create
Ce dossier contiendra les données de création de la base de données, ainsi que le template utilisé pour le site.
Elles seront créées dans le dossier src/Entity
via la commande :
php bin/console make:entity
php bin/console make:entity
> PhpFunction
> no
> title
> string
> 120
> no
> slug
> string
> 125
> no
> description
> string
> 255
> no
> text
> text
> no
> visibility
> boolean
> no
> createdAt
> datetime
> no
> updatedAt
> datetime
> yes
# src/Entity/PhpFunction.php
# ...
# DateTimeInterface
use DateTimeInterface;
# ...
/*
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
transformation en unsigned :
*/
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(
type: Types::INTEGER,
options: ['unsigned' => true]
)]
private ?int $id = null;
# ...
/*
#[ORM\Column()]
private ?bool $visibility = null;
Pour avoir true par défaut :
*/
#[ORM\Column(
type: Types::BOOLEAN,
options: ['default' => true]
)]
private ?bool $visibility = null;
# ...
/*
#[ORM\Column(type: Types::DATETIME_MUTABLE)]
private ?DateTimeInterface $createdAt = null;
Pour avoir la date courante par défaut et ne pas pouvoir l'insérer côté Symfony :
*/
#[ORM\Column(
type: Types::DATETIME_MUTABLE,
options: [
'default' => 'CURRENT_TIMESTAMP',
'insertable' => false
]
)]
private ?DateTimeInterface $createdAt = null;
# ...
/*
#[ORM\Column(type: Types::DATETIME_MUTABLE, nullable: true)]
private ?DateTimeInterface $updatedAt = null;
Pour mettre à jour la date courante à chaque modification en passant par Symfony :
*/
#[ORM\Column(
type: Types::DATETIME_MUTABLE,
nullable: true,
options: [
'insertable' => false,
'updateable' => true,
]
)]
private ?DateTimeInterface $updatedAt = null;
Préparation de la migration :
php bin/console make:migration
suivi de la migration :
php bin/console doctrine:migrations:migrate
> yes
Création du dossier tests/Entity
:
Création du fichier PhpFunctionTest.php
où seront effectués les tests unitaires :
tests/Entity/PhpFunctionTest.php
Vérification des tests unitaires :
vendor/bin/phpunit --testdox tests/Entity/PhpFunctionTest.php
Pour le moment, nous vérifions que l'entité PhpFunction
est bien instanciée.
php bin/console make:form
> PhpFunctionType
> PhpFunction
Le formulaire est créé dans le dossier src/Form/PhpFunctionType.php
.
Voici son contenu par défaut :
<?php
# src/Form/PhpFunctionType.php
namespace App\Form;
use App\Entity\PhpFunction;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class PhpFunctionType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('title')
->add('slug')
->add('description')
->add('text')
->add('visibility')
->add('createdAt', null, [
'widget' => 'single_text',
])
->add('updatedAt', null, [
'widget' => 'single_text',
])
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => PhpFunction::class,
]);
}
}
php bin/console make:controller
> HomepageController
> PHPUnit tests? yes
3 fichiers sont créés :
on modifie le fichier src/Controller/HomepageController.php
:
# src/Controller/HomepageController.php
#...
#[Route('/', name: 'homepage')]
public function index(): Response
{
return $this->render('homepage/index.html.twig', [
'controller_name' => 'HomepageController',
]);
}
#...
et son test unitaire tests/Controller/HomepageControllerTest.php
:
# tests/Controller/HomepageControllerTest.php
#...
public function testSomething(): void
{
$client = static::createClient();
$client->request('GET', '/');
self::assertResponseIsSuccessful();
}
#...
php bin/console make:user
> User
> username
> email
> password
> ROLE_USER
composer require easycorp/easyadmin-bundle
php bin/console make:admin:dashboard
php bin/console make:security:form-login
php bin/console security:hash-password