Laravel

Un framework qui rend heureux

Voir cette catégorie
Vers le bas
Coder avec ChatGPT
Dimanche 8 janvier 2023 17:23

L'intelligence artificielle prend de plus en plus de place dans de multiples domaines. Jusque-là, l'utilisation pour le codage n'était pas vraiment convaincante mais... Avec l'arrivée de ChatGPT (que vous pouvez trouver sur le site OpenAI) change la donne. On peut désormais poser des questions précises en langage naturel, même en français, et obtenir des réponses réellement utiles. Pour illustrer cela, je vais dans cet article montrer comment on peut se faciliter la vie en reprenant des éléments de mon exemple de première application Laravel.

Les données

Dans mon application, je crée une migration pour une table de tâches. J'ai donc demandé à ChatGPT de la créer pour moi avec cette question :

Avec laravel 9 je veux une migration pour la table tasks avec title, detail et state (boolean)
Et voilà la réponse que j'ai obtenue (en français !) :

Pour créer une migration pour une table tasks avec des colonnes title, detail et state dans Laravel 9, vous pouvez utiliser la commande suivante :

php artisan make:migration create_tasks_table --create=tasks

Cela va créer un nouveau fichier de migration dans le répertoire database/migrations. Dans ce fichier, vous pouvez définir la structure de la table tasks. Pour ajouter les colonnes title, detail et state à la table, vous pouvez utiliser les types de colonne string et boolean, comme ceci :

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

class CreateTasksTable extends Migration
{
    public function up()
    {
        Schema::create('tasks', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('detail');
            $table->boolean('state')->default(false);
            $table->timestamps();
        });
    }

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

Une fois que vous avez défini la structure de la table tasks, vous pouvez exécuter la migration pour créer la table dans votre base de données en utilisant la commande suivante :

php artisan migrate

Cela va créer la table tasks dans votre base de données avec les colonnes title, detail et state.


Autant dire que je n'aurais pas fait mieux dans cette rédaction !

Le contrôleur et les routes

J'ai ensuite demandé la création du contrôleur et des routes avec cette question :
Avec Laravel 9 je veux un contrôleur de ressource TaskController et ses routes avec le middleware auth
Et voilà la réponse :
Voici comment vous pouvez créer un contrôleur de ressource TaskController dans Laravel 9 et ajouter le middleware auth à ses routes :
  1. Ouvrez votre terminal et placez-vous dans le répertoire de votre projet Laravel.
  2. Exécutez la commande suivante pour créer le contrôleur de ressource TaskController :
php artisan make:controller TaskController --resource
  1. Ouvrez le fichier routes/web.php et ajoutez les routes suivantes :
Route::resource('tasks', 'TaskController')->middleware('auth');

Cela créera toutes les routes de base pour votre contrôleur de ressource TaskController et les protégera avec le middleware auth :

Verb    URI                   Action  Route Name
GET     /tasks                index   tasks.index
GET     /tasks/create         create  tasks.create
POST    /tasks                store   tasks.store
GET     /tasks/{task}         show    tasks.show
GET     /tasks/{task}/edit    edit    tasks.edit
PUT     /tasks/{task}         update  tasks.update
DELETE  /tasks/{task}         destroy tasks.destroy

C'est pas mal non plus ! Le seul souci, c'est que ce n'est pas exactement pour Laravel 9, mais plutôt pour Laravel 8 au niveau des routes. Mais j'aime bien le côté didactique du texte.

Les vues

Je me suis ensuite posé la question des vues et me suis demandé comment formuler la question pour la vue de création d'une tâche. Mes premières tentatives aboutissaient toujours à l'utilisation d'un package pour créer le formulaire, j'ai fini par écrire cette question :

Dans laravel 9 je veux créer une vue de création (create) à partir d'un table tasks contenant title, detail et state (boolean). Le formulaire doit utiliser Tailwind et aucune librairie. J'ai un contrôleur de ressource TaskController.
Et voilà la réponse :

Voici comment vous pouvez créer une vue de création de tâche dans Laravel 9 qui utilise Tailwind CSS et qui n'utilise pas de librairie de formulaire, en utilisant un contrôleur de ressource TaskController :

  1. Ouvrez le fichier app/Http/Controllers/TaskController.php et ajoutez une méthode create qui affichera la vue de création de tâche :
public function create()
{
    return view('tasks.create');
}

Créez un fichier resources/views/tasks/create.blade.php qui contiendra la vue de création de tâche :

@extends('layouts.app')

@section('content')
    <h1 class="text-2xl font-bold mb-4">{{ __('Créer une tâche') }}</h1>
    <form method="POST" action="{{ route('tasks.store') }}" class="bg-white shadow-md rounded px-8 pt-6 pb-8 mb-4">
        @csrf
        <div class="mb-4">
            <label for="title" class="block text-gray-700 text-sm font-bold mb-2">{{ __('Titre') }}</label>
            <input id="title" type="text" name="title" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline" required>
        </div>
        <div class="mb-4">
            <label for="detail" class="block text-gray-700 text-sm font-bold mb-2">{{ __('Détails') }}</label>
            <textarea id="detail" name="detail" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"></textarea>
        </div>
        <div class="mb-6">
            <label for="state" class="block text-gray-700 text-sm font-bold mb-2">{{ __('État') }}</label>
            <input id="state" type="checkbox" name="state" class="mr-2 leading-tight" value="1">
            <label for="state" class="text-sm">{{ __('Terminé') }}</label>
        </div>
        <div class="flex items-center justify-between">
            <button type="submit" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline">
                {{ __('Créer') }}
            </button>
        </div>
    </form>
@endsection

Je n'ai pas testé ce code, mais ça me semble constituer une bonne base.

La soumission

Voyons maintenant si on peut traiter la soumission du formulaire. J'ai posé cette question :

Avec Laravel 9 j'ai une table tasks contenant title, detail et state (boolean). J'ai une vue create avec un formulaire. j'ai un contrôleur de ressource TasksController. Je veux coder la fonction store du contrôleur pour traiter la soumission du formulaire.
Et j'ai obtenu ceci :

Voici comment vous pouvez coder la fonction store du contrôleur de ressource TasksController pour traiter la soumission du formulaire de création de tâche dans Laravel 9 :

  1. Ouvrez le fichier app/Http/Controllers/TaskController.php et ajoutez une méthode store qui sera appelée lors de la soumission du formulaire de création de tâche :
public function store(Request $request)
{
    $data = $request->validate([
        'title' => 'required|string|max:255',
        'detail' => 'nullable|string',
        'state' => 'boolean',
    ]);

    Task::create($data);

    return redirect()->route('tasks.index')->with('success', 'Tâche créée avec succès');
}

Cette méthode valide les données du formulaire en utilisant la méthode validate de la classe Request, puis crée une nouvelle tâche en utilisant le modèle Task et les données du formulaire. Enfin, elle redirige l'utilisateur vers la liste des tâches avec un message de succès.


Là encore, on obtient un code tout à fait intéressant qu'on peut ensuite peaufiner. Sur la lancée, j'ai posé cette question :

Je pourrais avoir la même chose pour la fonction update du contrôleur ?
Et il semble avoir de la mémoire parce que j'ai obtenu ça :

Voici comment vous pouvez coder la fonction update du contrôleur de ressource TasksController pour mettre à jour une tâche dans Laravel 9 :

  1. Ouvrez le fichier app/Http/Controllers/TaskController.php et ajoutez une méthode update qui sera appelée lors de la soumission du formulaire de mise à jour de tâche :
public function update(Task $task, Request $request)
{
    $data = $request->validate([
        'title' => 'required|string|max:255',
        'detail' => 'nullable|string',
        'state' => 'boolean',
    ]);

    $task->update($data);

    return redirect()->route('tasks.index')->with('success', 'Tâche mise à jour avec succès');
}

La liste des tâches

Puisqu'il semble avoir de la mémoire, j'ai continué :
Je pourrais aussi avoir la vue index dans le même esprit ?
Là, c'était encore bien parti, mais il semble y avoir un bug qui coupe la réponse :
Voici comment vous pouvez créer une vue d'index de tâches dans Laravel 9 qui utilise Tailwind CSS et qui n'utilise pas de librairie de tableau :
  1. Ouvrez le fichier app/Http/Controllers/TaskController.php et ajoutez une méthode index qui affichera la vue d'index de tâches :
public function index()
{
    $tasks = Task::all();
    return view('tasks.index', compact('tasks'));
}

Créez un fichier resources/views/tasks/index.blade.php qui contiendra la vue d'index de tâches :

@extends('layouts.app')

@section('content')
    <h1 class="text-2xl font-bold mb-4">{{ __('Tâches') }}</h1>
    <table class="w-full text-left table-collapse">
        <thead class="bg-gray-200">
            <tr>
                <th class="py-4 px-6 font-bold uppercase text-sm text-gray-600 bg-gray-100">{{ __('Titre') }}</th>
                <th class="py-4 px-6 font-bold uppercase text-sm text-gray-600 bg-gray-100">{{ __('Détails') }}</th>
                <th class="py-4 px-6 font-bold

Je ne saurai peut-être jamais la suite, même en régénérant la réponse ça coince, mais c'est une version beta pour le moment.

Les tests

J'ai continué ainsi :
Pourrai-je avoir des tests pour les codes ci-dessus ?
Et voilà :

Voici comment vous pouvez écrire des tests de unité pour les différentes fonctions du contrôleur de ressource TasksController que j'ai présentées ci-dessus :

Pour la fonction store :
/** @test */
public function a_task_can_be_created()
{
    $response = $this->post(route('tasks.store'), [
        'title' => 'Test task',
        'detail' => 'Test task detail',
        'state' => true,
    ]);

    $response->assertRedirect(route('tasks.index'));
    $this->assertDatabaseHas('tasks', [
        'title' => 'Test task',
        'detail' => 'Test task detail',
        'state' => true,
    ]);
}
Pour la fonction update :
/** @test */
public function a_task_can_be_updated()
{
    $task = factory(Task::class)->create();

    $response = $this->patch(route('tasks.update', $task), [
        'title' => 'Updated task',
        'detail' => 'Updated

Là encore la transimission s'est interrompue avant la fin...

Conclusion

J'ai fait pas mal d'autres essais avec parfois des résultats bluffants. Il faut aussi souligner que ChatGPT peut être aussi très bon pour détecter des bugs dans du code. Je pense m'en faire un outil pour éccélérer et faciliter le codage, tout en restant prudent, même s'il utilise une quantité montrueuse de données ce n'est qu'une machine.



Par bestmomo

Nombre de commentaires : 1