From 8af5aebfe34a07e9c301beff1a350e73b3a23954 Mon Sep 17 00:00:00 2001 From: Maxime Renou Date: Fri, 19 Apr 2024 19:03:17 +0200 Subject: [PATCH] feat: crud --- README.md | 44 ++++++++++----- src/Console/Install.php | 4 +- src/Console/MakeCRUD.php | 123 +++++++++++++++++++++++++++++++++++++++++ src/Console/MakeMigrations.php | 12 +++- src/Console/ProxyCommand.php | 14 ++--- src/ServiceProvider.php | 2 + 6 files changed, 173 insertions(+), 26 deletions(-) create mode 100644 src/Console/MakeCRUD.php diff --git a/README.md b/README.md index d85e101..3d48a18 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,45 @@ # BAG Laravel Helper -This package provides Laravel commands to execute BAG for Laravel Stack. +Ce package Laravel fournit des commandes pour générer du code via BAG par Bluesquare. ## Installation -Edit your `composer.json` file to include the following dependency: +Mettre à jour les sources de `composer.json` avec : -``` -"require": { - "bag/laravel-helper": "dev-main" -}, -"repositories": [ - { - "type": "vcs", - "url": "https://git.bluesquare.io/bag/laravel-helper.git" - } -] +```shell +composer config repositories.bag vcs https://git.bluesquare.io/bag/laravel-helper.git -n ``` -Then run: +Puis installer le package : -```bash -composer update bag/laravel-helper +```shell +composer require bag/laravel-helper ``` ## Usage +Pour installer BAG : + +```shell +php artisan bag:install ``` + +Pour générer un CRUD en créant/partant d'un model : + +```shell +php artisan bag:crud +``` + +```shell +sail artisan bag:crud +``` + +Pour générer des migrations automatiquement : + +```shell php artisan bag:migrations ``` + +```shell +sail artisan bag:migrations +``` diff --git a/src/Console/Install.php b/src/Console/Install.php index 27a2c57..fce2e07 100644 --- a/src/Console/Install.php +++ b/src/Console/Install.php @@ -15,7 +15,7 @@ class Install extends ProxyCommand /** * @var string */ - protected $description = 'Install required packages'; + protected $description = 'Installer les packages requis'; /** * @return int|null @@ -23,7 +23,7 @@ class Install extends ProxyCommand public function handle() { if (env('LARAVEL_SAIL')) { - $this->error("🐳 To install packages, please run 'php artisan bag:install' outside Sail."); + $this->error("🐳 Pour installer les packages, exécuter 'php artisan bag:install' en dehors de Sail."); return 0; } diff --git a/src/Console/MakeCRUD.php b/src/Console/MakeCRUD.php new file mode 100644 index 0000000..4654a6e --- /dev/null +++ b/src/Console/MakeCRUD.php @@ -0,0 +1,123 @@ +comment("Note : si le model existe déjà, il ne sera pas écrasé."); + + $model = $this->argument('model'); + + if (! $model) { + $model = $this->ask("Nom du modèle ? (ex : User)"); + + if (empty($model)) { + $this->error("Nom de model invalide."); + return 1; + } + } + + $controller = $this->confirm("Générer un Controller ?", true); + $policy = $this->confirm("Générer une Policy ?", $controller); + $resource = $this->confirm("Générer une Resource ?", $controller); + $views = $this->confirm("Générer des vues ?", true); + + if (! $controller) { + $routing = false; + } else { + $routing = $this->confirm("Ajouter automatiquement les routes ?", true); + } + + $model_name = "App\\Models\\$model"; + + if (class_exists($model_name)) { + $this->comment("Le model existe déjà - ignoré."); + } + + $controller_name = "App\\Http\\Controllers\\{$model}Controller"; + + if ($controller && class_exists($controller_name)) { + $this->comment("Le controller existe déjà - ignoré."); + $controller = false; + } + + $policy_name = "App\\Policies\\{$model}Policy"; + + if ($policy && class_exists($policy_name)) { + $this->comment("La policy existe déjà - ignorée."); + $policy = false; + } + + $resource_name = "App\\Http\\Resources\\{$model}Resource"; + + if ($resource && class_exists($resource_name)) { + $this->comment("La resource existe déjà - ignorée."); + $resource = false; + } + + $result = app(\BAG\Stack\Laravel\MakeCRUD::class)->run($model, [ + 'model' => ! class_exists($model_name), + 'controller' => $controller, + 'policy' => $policy, + 'resource' => $resource, + 'views' => $views, + ]); + + if (! $result) { + $this->error("Erreur lors de la génération du CRUD."); + return 1; + } + + if ($routing) { + $this->addRoutes($model); + } + + $this->info("CRUD généré avec succès."); + + return 0; + } + + protected function addRoutes($model) + { + $file = base_path('routes/web.php'); + + if (! file_exists($file)) { + $this->warn("Le fichier $file n'existe pas - ajout des routes ignoré."); + return; + } + + $prefix = Str::snake(Str::plural($model)); + $test = "Route::resource('{$prefix}',"; + $line = "Route::resource('{$prefix}', \App\Http\Controllers\\{$model}Controller::class)->withTrashed(['show'])->middleware('auth');"; + + $routes = trim(file_get_contents($file)); + + if (strpos($routes, $test) !== false) { + $this->warn("Les routes existent déjà - ajout des routes ignoré."); + return; + } + + $routes .= "\n\n$line\n"; + + file_put_contents(base_path('routes/web.php'), $routes); + } +} diff --git a/src/Console/MakeMigrations.php b/src/Console/MakeMigrations.php index 9c5da36..a8c800a 100644 --- a/src/Console/MakeMigrations.php +++ b/src/Console/MakeMigrations.php @@ -15,13 +15,21 @@ class MakeMigrations extends ProxyCommand /** * @var string */ - protected $description = 'Generate migrations based on current database schema and models'; + protected $description = 'Génère des migrations en comparant les models et les tables existants.'; /** * @return int|null */ public function proxyHandle() { - return app(\BAG\Stack\Laravel\MakeMigrations::class)->run(); + $result = app(\BAG\Stack\Laravel\MakeMigrations::class)->run(); + + if ($result) { + $this->info('Migrations générées !'); + } else { + $this->info('Aucune migration générée.'); + } + + return 0; } } diff --git a/src/Console/ProxyCommand.php b/src/Console/ProxyCommand.php index e61caeb..214747b 100644 --- a/src/Console/ProxyCommand.php +++ b/src/Console/ProxyCommand.php @@ -26,7 +26,7 @@ abstract class ProxyCommand extends Command $package_path = "{$this->base_path}/packages/$package"; if (! is_dir($package_path)) { - $this->error("🚨 Missing package bag/$package. Please run 'php artisan bag:install' first."); + $this->error("🚨 Le package bag/$package est manquant. Merci d'exécuter 'php artisan bag:install' pour commencer."); return 1; } @@ -57,28 +57,28 @@ abstract class ProxyCommand extends Command $package_path = "$install_path/$package"; if (! is_dir($package_path)) { - $this->info("🚚 Installing bag/$package..."); + $this->info("🚚 Installation de bag/$package..."); $result = Process::path($install_path) ->run("git clone git@git.bluesquare.io:bag/$package.git $package"); if ($result->failed()) { - throw new \Exception("Failed to fetch bag/$package"); + throw new \Exception("Récupération de bag/$package impossible."); } } elseif (! cache()->has("bag/$package")) { - $this->info("🤖 Updating bag/$package..."); + $this->info("🤖 Mise à jour de bag/$package..."); $result = Process::path($package_path)->run("git pull"); if ($result->failed()) { - $this->warn("😰 Failed to update!"); + $this->warn("😰 Échec de mise à jour !"); } cache()->put("bag/$package", true, now()->addMinutes(5)); } - $this->info("🐠 Loading bag/$package..."); + $this->info("🐠 Chargement de bag/$package..."); $result = Process::path($package_path)->run("composer install --ignore-platform-reqs"); - $this->info("⚡️ Installed!"); + $this->info("⚡️ Installation réussie !"); } } diff --git a/src/ServiceProvider.php b/src/ServiceProvider.php index 480a2bf..7b64f2d 100644 --- a/src/ServiceProvider.php +++ b/src/ServiceProvider.php @@ -30,6 +30,7 @@ class ServiceProvider extends \Illuminate\Support\ServiceProvider implements Def $this->commands([ Console\Install::class, Console\MakeMigrations::class, + Console\MakeCRUD::class, //... ]); } @@ -44,6 +45,7 @@ class ServiceProvider extends \Illuminate\Support\ServiceProvider implements Def return [ Console\Install::class, Console\MakeMigrations::class, + Console\MakeCRUD::class, ]; } }