Ora che abbiamo il processo di login e registrazione funzionanti, possiamo dedicarci ad aggiungere gli altri campi necessari al corretto funzionamento del profilo utente.
I campi che andremo a creare per il nostro utente sono:
fullName
: stringa che può essere anche nulla;avatar
: stringa che può essere anche nulla;createdAt
: datetime che conterrà la data di creazione dell’utente.
Per aggiungere campi ad un'entità esistente possiamo utilizzare uno dei comandi del MakerBundle
, il make:entity
che consente di creare nuove entità o aggiornarne di esistenti.
Prima di iniziare con le operazioni ripuliamo il database per evitare di avere errori durante l'esecuzione delle migrazioni:
./bin/console doctrine:database:drop --if-exists --force
./bin/console doctrine:database:create --no-interaction
./bin/console doctrine:migrations:migrate --no-interaction
Lanciamo ora il ./bin/console make:entity
, indichiamo il nome della classe User
e il tool ci dirà che, esistendo già, possiamo aggiungere nuovi campi. Indicando il nome del campo, il tool proverà a dedurre il tipo di dato suggerendolo; qualora non fosse quello corretto potremmo in ogni caso indicare quello corretto o premere ?
per scegliere tra quelli supportati.
Per accettare i suggerimenti possiamo premere il pulsante di Invio per procedere automaticamente. Questo l'output atteso nel nostro caso:
$ ./bin/console make:entity
Class name of the entity to create or update (e.g. GrumpyElephant):
> User
Your entity already exists! So let's add some new fields!
New property name (press <return> to stop adding fields):
> fullName
Field type (enter ? to see all types) [string]:
>
Field length [255]:
> 50
Can this field be null in the database (nullable) (yes/no) [no]:
> yes
updated: src/Entity/User.php
Add another property? Enter the property name (or press <return> to stop adding fields):
> avatar
Field type (enter ? to see all types) [string]:
>
Field length [255]:
>
Can this field be null in the database (nullable) (yes/no) [no]:
> yes
updated: src/Entity/User.php
Add another property? Enter the property name (or press <return> to stop adding fields):
> createdAt
Field type (enter ? to see all types) [datetime]:
>
Can this field be null in the database (nullable) (yes/no) [no]:
>
updated: src/Entity/User.php
Add another property? Enter the property name (or press <return> to stop adding fields):
>
Success!
Next: When you're ready, create a migration with php bin/console make:migration
Il comando ci suggerisce, al termine dell'esecuzione, di creare una migrazione. Seguiamo il suggerimento lanciando il comando e poi, prima di proseguire facendo girare la migrazione, effettuiamo una piccola modifica alla nostra entità. Creiamo un costruttore per l'entità User
in maniera da inizializzare la proprietà createdAt
:
public function __construct()
{
$this->createdAt = new \DateTimeImmutable();
}
A questo punto possiamo far girare la migrazione con il comando bin/console doctrine:migrations:migrate
.
Giunti a questo punto, se diamo un’occhiata alla tabella nel nostro database noteremo che sono stati aggiunti i nuovi campi come da noi richiesto. Possiamo quindi ricreare le fixtures, non prima di aver personalizzato i nuovi campi all'interno della class App\DataFixtures\AppFixtures
:
$ryan = new User();
//...
$ryan->setFullName('Ryan');
$ryan->setAvatar('assets/img/ryan.jpg');
$julie = new User();
//...
$julie->setFullName('Julie');
$julie->setAvatar('assets/img/julie.jpg');
Avendo spesso la necessità di ricreare l'ambiente locale da zero, ho creato per comodità uno script dentro composer che ci permetterà di cancellare automaticamente il database, ricrearlo da zero, applicare le migrazione e caricare le fixtures. Per creare nuovamente gli utenti possiamo quindi lanciare il comando:
composer run fixtures
Se siete curiosi di vedere cosa fa il comando potete spulciare il file composer.json
nella sezione scripts
e guardare i comandi eseguiti per la proprietà fixtures
.
Sostituire le proprietà nei template
Ora che supportiamo le nuove proprietà dell'entità User
possiamo aggiornare il nostro Twig affinché carichi dinamicamente il nome utente e l'avatar in home page.
L'utente corrente è accessibile in Twig attraverso la proprietà app.user
, quindi apriamo il file app/templates/home/index.html.twig
ed effettuiamo le seguenti sostituzioni:
<div class="container">
<div class="photo-container">
<img src="{{ asset(app.user.avatar) }}" alt="">
</div>
{% if app.user.fullName %}<h3 class="title">{{ app.user.fullName }}</h3>{% endif %}
<p class="category">{{ app.user.email }}</p>
</div>
Dato che l'avatar è opzionale, potremmo modificare il metodo getAvatar
nella entity per restituire un default quando non è presente:
public const DEFAULT_AVATAR = 'assets/img/default-avatar.png';
public function getAvatar(): ?string
{
return $this->avatar ?? self::DEFAULT_AVATAR;
}
Ora che abbiamo tutti i campi di cui abbiamo bisogno, possiamo dedicarci alla creazione di una form per consentire all'utente di modificarli. Il codice della lezione è disponibile con il tag user-entity
.