Aller au contenu principal
Version: NEXT GEN

Configuration

Les produits peuvent avoir des configurations permettant de contrôler les performances comme la mémoire ou la RAM. Ils permettent par la suite de livrer des services à partir de cette configuration.

Interface : App/Contracts/Store/ProductConfigInterface

Classe abstraite : App/Abstracts/AbstractConfig

Création de la classe

L'interface App/Contracts/Store/ProductConfigInterface définit les méthodes que chaque classe de configuration doit implémenter pour gérer la configuration des produits. Les méthodes principales sont :

  • validate(): Définit les règles de validation pour la configuration.
  • render(): Retourne le formulaire HTML pour afficher et modifier la configuration du produit.
  • storeConfig(): Permet de sauvegarder les configurations dans la base de données.
  • updateConfig(): Met à jour les configurations existantes dans la base de données.
  • deleteConfig(): Supprime la configuration associée à un produit.
  • getConfig(): Récupère la configuration d'un produit.
  • cloneConfig(): Permet de cloner une configuration d'un produit vers un autre.
<?php
// addons/fund/src/CustomProductConfig.php
namespace App\Addons\Fund;

use App\Abstracts\AbstractConfig;
use App\Models\Store\Product;
use App\Models\Provisioning\Server;

class CustomProductConfig extends AbstractConfig
{
protected string $type = 'custom-product';
protected string $model = \App\Addons\Fund\Models\GameserverConfigModel::class;

/**
* Rendre le formulaire de configuration pour un produit spécifique
*/
public function render(Product $product)
{
$context = [
'servers' => $this->servers, // Les serveurs disponibles
'config' => $this->getConfig($product->id, new $this->model), // La configuration existante ou une nouvelle instance
];

return view('fund_admin::product-config', $context);
}

/**
* Valider les données de la configuration
*/
public function validate(): array
{
return [
'memory' => 'required|numeric|min:512',
'cpu' => 'required|numeric|min:1',
'disk' => 'required|numeric|min:10',
'server_id' => 'required|exists:servers,id',
];
}

/**
* Sauvegarder la configuration pour un produit
*/
public function storeConfig(Product $product, array $parameters)
{
$this->model::create($parameters + ['product_id' => $product->id]);
}

/**
* Mettre à jour la configuration pour un produit
*/
public function updateConfig(Product $product, array $parameters)
{
$this->model::where('product_id', $product->id)->update($parameters);
}
}

Création de la migration

Utilisez la commande artisan suivante pour créer une migration pour la table de configuration du serveur de jeu :

php artisan clientxcms:create-migration-extension

Lorsque la commande demande le nom de la migration, entrez :

CreateGameserverConfigTable

Ensuite, dans le fichier de migration généré, définissez la structure de la table en ajoutant un champ product_id pour faire la liaison avec les produits :

// database/migrations/2022_01_01_000000_create_gameserver_config_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateGameserverConfigTable extends Migration
{
public function up()
{
Schema::create('gameserver_configs', function (Blueprint $table) {
$table->id();
$table->foreignId('product_id')->constrained('products')->onDelete('cascade'); // Lien avec la table des produits
$table->integer('memory');
$table->integer('cpu');
$table->integer('disk');
$table->foreignId('server_id')->constrained('servers')->onDelete('cascade'); // Lien avec la table des serveurs
$table->timestamps();
});
}

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

Vue du formulaire de configuration

Vous pouvez créer une vue dans le dossier addons/fund/views/admin/product-config.blade.php pour afficher le formulaire de configuration :

<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<div>
@include("admin/shared/input", ['name' => 'memory', 'label' => __('provisioning.memory'), 'value' => $config->memory, 'help' => __('provisioning.in_gb'), 'type' => 'number','step' => '0.1', 'min' => 0])
</div>
<div>
@include("admin/shared/input", ['name' => 'disk', 'label' => __('provisioning.disk'), 'value' => $config->disk, 'help' => __('provisioning.in_gb'), 'type' => 'number', 'step' => '0.1', 'min' => 0])
</div>
<div>
@include("admin/shared/input", ['name' => 'cpu', 'label' => __('provisioning.cpu'), 'value' => $config->cpu, 'type' => 'number'])
</div>
</div>

Création du modèle associé

Créez un modèle pour représenter la configuration du serveur de jeu. Nous recommandons de nommer ce modèle GameserverConfigModel pour plus de clarté :

namespace App\Addons\Fund\Models;

use Illuminate\Database\Eloquent\Model;

class GameserverConfigModel extends Model
{
protected $table = 'gameserver_configs'; // Nom de la table

protected $fillable = [
'product_id',
'memory',
'cpu',
'disk',
'server_id',
];

public function product()
{
return $this->belongsTo(\App\Models\Store\Product::class);
}

public function server()
{
return $this->belongsTo(\App\Models\Provisioning\Server::class);
}
}

Enregistrement de la classe dans le produit

Une fois la classe de configuration et le modèle créé, vous devez associer cette configuration au produit en l'enregistrant dans la méthode config() de la classe produit. Voici un exemple :

public function config(): ?\App\Contracts\Store\ProductConfigInterface
{
return new \App\Addons\Fund\GameserverConfig(); // Retourne la classe de configuration pour ce produit
}

Cela permet au CMS d'utiliser la configuration lors de la gestion des produits, en affichant le formulaire de configuration et en validant les données lors de la création ou modification d'un produit.