Autour de Laravel

comment utiliser une classe comme un type de variable dans une autre classe

Avatar de samsam
samsam

Bonjour a tous (modifier) j'ai crée un petit projet avec les classes suivante: Projet-Automate-Etat-Transition-et Propriete j'ai crée deux variables** etat source et etat destination ** dans la table transitions (migration)comme suit ** $table->etat('etat_source'); $table->etat('etat_destination');**

je souhaite utiliser la classe Etat comme un type de variable etat dans la classe **Transition **

est ce que c'est possible et comment!! merci

Posté il y a 1 an
Avatar de Nicolus
Nicolus

Si je comprends bien tu veux quelque chose comme ça

class Automate
{
    protected Etat $etatInitial ;
    
    public function __construct() {
        $this->etatInitial = new Etat();
    }
}

Mais si tu veux plus de flexibilité dans ton code il vaut probablement mieux utiliser de l'injection de dépendance :

class Automate
{
    protected Etat $etatInitial ;
    
    public function __construct(Etat $etatInitial) {
        $this->etatInitial = $etatInitial;
    }
}

Qui depuis PHP8 peut être simplifié :

class Automate
{
    public function __construct(protected Etat $etatInitial) {

    }
}

Bonne chance !

Posté il y a 1 an
Avatar de khalyomede
khalyomede

Bonjour,

A mon avis ton approche n'est pas la bonne, car stocker une classe comme un type en se basant sur un modèle n'est valable qu'en mémoire PHP (et si tu veux le persister, tu va rentrer dans des considérations qui me paraissent bien plus compliquée que l'objectif que tu souhaite atteindre).

En réalité ce que tu cherche à faire c'est stocker dans la table transition l'état "source" et l'état "destination".

Je vais imaginer des états qui n'ont probablement rien à voir avec ce que tu modélisera, mais je le fais car tu n'en a pas précisé en exemple.

Imagine que tu as 2 états dans la table "etats" :

id nom
1 En attente
2 En cours
3 Terminé

Ces états sont bien évidemment créés via des Seeders et disponibles à l'installation de ton application (php artisan migrate --seed si c'est la première installation).

Ce que tu veux faire maintenant c'est associer un état "source" et "destination" sur un enregistrement de la table "transitions". Donc ta migration pour cette dernière ressemblera à quelque chose comme :

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateTransitionsTable extends Migration
{
  public function up()
  {
    Schema::create('transitions', function (Blueprint $table) {
      $table->id();
      $table->unsignedBigInteger("etat_source_id");
      $table->unsignedBigInteger("etat_destination_id");
      $table->foreign("etat_source_id")->references("id")->on("etats");
      $table->foreign("etat_destination_id")->references("id")->on("etats");
      $table->timestamps();
    });
  }

  public function down()
  {
    Schema::dropIfExists('users');
  }
}

Grâce à ces colonnes tu pourras créer un enregistrements dans la table "transitions" en l'associant avec les état "source" et "destination" de ton choix. Voici un exemple dans un controller :

namespace App\Http\Controllers;

use App\Models\Transition;
use Illuminate\Http\Request;

class AboutUsController extends Controller
{
  public function store(Request $request)
  {
    // Valider la request, ou utiliser une FormRequest
    // ...

    // Stocker la valeur
    $transition = new Transition();

    $transition->etatSource()->associate($request->etatSourceId);
    $transition->etatDestination()->associate($request->etatDestinationId);
    $transition->save();

    // Retourner la réponse
    return redirect()->back();
  }
}

Si on admet que l'utilisateur final à une page HTML où il peut renseigner dans un formulaire l'état source et destination.

Le code dans le controlleur admettra le modèle Transition contenant au moins :

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Transition extends Model
{
  use HasFactory;

  public function etatSource()
  {
    return $this->belongsTo(Etat::class, "etat_source_id");
  }

  public function etatDestination()
  {
    return $this->belongsTo(Etat::class, "etat_destination_id");
  }
}

Enfin, pour retrouver les noms des états sur un enregistrement transition existant, il te suffira qu'à accéder à leur relationship :

namespace App\Http\Controllers;

use App\Models\Transition;

class TransitionController extends Controller
{
  public function show(Transition $transition)
  {
    $nomEtatSource = $transition->etatSource->name;

    // Retourner la vue
    // ...
  }
}

En esperant que ça aide !

Posté il y a 1 an

Vous ne pouvez pas répondre à ce sujet.