Bonjour ! :)
J'ai donc continué à développer le framework en bundleless. Concernant la configuration, le paramètre "env" pourra maintenant prendre en valeur "prod" ou "dev". "local" remplacé par "dev", ça me semble plus logique :D .
Comme je l'avais dit, je me suis concentré surtout sur l'ORM, avec pour inspiration Laravel. J'ai développé les changements cités ci-dessous en développant en même temps un jeu en ligne.
Migration SQL
Et j'ai donc commencé par faire un système de migration, exécutable par la commande console :
php console.php ORM:migration --all
Dans le dossier database/migration (Hiérarchie de dossiers très inspirée :D ), vous pourrez créer vos class de migration. Dans mon cas, pour ma table user, voici le code de la class :
<?php
namespace Database\migration;
use Frash\ORM\Database\Migration;
class CreateUserTable extends Migration
{
public function upload()
{
$this->addTable('user', function(){
$this->increment('id');
$this->varchar('pseudo')->length(30);
$this->char('password')->length(40);
$this->varchar('mail')->length(100);
$this->bigint('points')->default(20);
$this->bigint('main_territory')->default(0);
$this->bigint('current_territory')->default(0);
$this->smallint('rang')->default(2);
$this->timeRecord();
$this->deleteRecord();
});
}
}
$this->timeRecord() va créer deux colonne "created_at" et "updated_at" dans la table.
$this->deleteRecord() créera une colonne "deleted_at".
La class peut s'appeler de la façon dont on veut. Et le système de migration n'est pour l'instant compatible qu'avec MySQL :D
Entity
J'ai revu le fonctionnement des entités et des repositorys. L'on peut instancier une entity ou un repository depuis l'action d'un controller. Et dans un repository, on peut instancier, par exemple, l'entité et le querybuilder dans le __construct.
<?php
namespace App\Repository;
use App\Entity\User;
class UserRepository
{
public $user;
public function __construct(User $user)
{
$this->user = $user;
}
}
Concernant l'entité, pour l'instant, il y a seulement plusieurs propriétés à renseigner :
<?php
namespace App\Entity;
use Frash\ORM\Query\Entity\Entity;
class User extends Entity
{
public $table = 'user';
public $primary_key = 'id';
public $time_record = true;
public $delete_record = true;
public $cols = [
'pseudo', 'password', 'mail', 'points', 'rang'
];
public $defaults = [
'points' => 20, 'rang' => 2
];
}
Dans le repository, ou le controller, vous pouvez créer une requête directement grâce à l'entité. (Avant, il fallait obligatoirement le faire dans le repository, avec le QueryBuilder).
Insert
<?php
public function insertUser(string $pseudo, string $password, string $mail): int
{
$this->user->pseudo = $pseudo;
$this->user->password = $password;
$this->user->mail = $mail;
return $this->user->insert();
}
Fonctionnalité à venir, si vous mettez true dans ->insert() , ça vous retournera l'entité intégrale avec toutes les colonnes et leur valeur.
Update
<?php
public function updateRangUser(int $user_id, int $rang)
{
$this->user->where('id', $user_id)->update([ 'rang' => $rang ]);
}
Select - Premier résultat
<?php
public function getRangUser(int $user_id): int
{
return $this->user->where('id', $user_id)->just('rang')->first();
}
Pour ce cas-ci, j'ai utilisé la fonction just() intégrée à l'entity. Ca va tout simplement remplacer le dans le SELECT FROM, par les colonnes indiquées.
Count
<?php
public function countByPseudo(string $pseudo): int
{
return $this->user->where('pseudo', $pseudo)->count();
}
Where
Concernant le Where, vous pouvez toujours renseigner de cette manière :
<?php
where('id', $user_id);
where('id', '>', $user_id);
S'il n'y pas de troisième paramètre, comme dans la première ligne, le signe de comparaison sera automatiquement "=".
Si vous voulez renseignez plusieurs where d'affilés, et que ce n'est pas un OR (Pas encore intégré), comme Laravel, vous pouvez faire :
<?php
where([
[ 'col' => 'dest_id', 'value' => $user_id ],
[ 'col' => 'type', 'sign' => 'IN', 'value' => [ 'type1', 'type2' ]]
]);
Dans le cas d'un IN, la clé "value" doit obligatoirement être reliée à un array.
On a fait le tour des quelques premières intégrations de l'entity.
Middleware
Dans le routing, vous pouvez faire un $this->group([ 'middleware' => '...' ], function(){});
J'ai intégré la possibilité d'ajouter un paramètre au middleware individuellement pour chaque route.
<?php
$this->group([ 'middleware' => '...' ], function(){
$this->get('route', 'Controller:action', [ 'middleware' => [ 'params' => [ 'test_param' => 'value_test' ]]]);
});
Ainsi, dans votre middleware, vous pourrez récupérer ce paramètre avec $this->params['test_param'].
Webprofiler
Un autre composant du framework que je souhaite développer énormément, c'est un WebProfiler comme celui de Symfony (J'ai de l'ambition :D ) avec une DebugBar.
La DebugBar est actuellement assez moche et ne donne que le code HTTP, le temps total d'exécution, le controller et l'action.
En bref, tout ça m'aura permit de réorganiser une petite partie du code du framework. Et c'est finit pour la présentation du jour :D
Je vous remercie pour le temps passé à lire ce gros pavé :D .