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 :
- Ouvrez votre terminal et placez-vous dans le répertoire de votre projet Laravel.
- Exécutez la commande suivante pour créer le contrôleur de ressource TaskController :
php artisan make:controller TaskController --resource
- 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 :
- Ouvrez le fichier
app/Http/Controllers/TaskController.php
et ajoutez une méthodecreate
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 :
- Ouvrez le fichier
app/Http/Controllers/TaskController.php
et ajoutez une méthodestore
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 :
- Ouvrez le fichier
app/Http/Controllers/TaskController.php
et ajoutez une méthodeupdate
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 :
- Ouvrez le fichier
app/Http/Controllers/TaskController.php
et ajoutez une méthodeindex
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 fonctionstore
:
/** @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