1: <?php
2:
3: namespace LaravelUi5\Core\Commands;
4:
5: use Illuminate\Filesystem\Filesystem;
6: use Illuminate\Support\Facades\File;
7: use Illuminate\Support\Str;
8:
9: class GenerateUi5ResourceCommand extends BaseGenerator
10: {
11: protected $signature = 'ui5:resource
12: {name : Resource name in App/Resource format (e.g. Offers/Header)}
13: {--php-ns-prefix=Pragmatiqu : Root namespace prefix for PHP classes}
14: {--js-ns-prefix=io.pragmatiqu : Root namespace prefix for JS artifacts}';
15:
16: protected $description = 'Generates a new Ui5 Action class using a predefined stub.';
17:
18: protected Filesystem $files;
19:
20: public function __construct(Filesystem $files)
21: {
22: parent::__construct();
23: $this->files = $files;
24: }
25:
26: public function handle(): int
27: {
28: $name = $this->argument('name');
29: $phpPrefix = rtrim($this->option('php-ns-prefix'), '\\');
30: $jsPrefix = rtrim($this->option('js-ns-prefix'), '.');
31: [$app, $resource] = $this->parseCamelCasePair($name);
32:
33: if (!$this->assertAppExists($app)) {
34: $this->components->error("App {$app} does not exist.");
35: return self::FAILURE;
36: }
37:
38: $className = Str::studly($resource);
39: $urlKey = Str::snake($resource);
40: $slug = Str::kebab($resource);
41: $phpNamespace = "{$phpPrefix}\\{$app}\\Resources\\{$className}";
42: $classDir = base_path("ui5/{$app}/src/Resources/{$className}");
43:
44: $classPath = "{$classDir}/Resource.php";
45: if (File::exists($classPath)) {
46: $this->components->error("Resource class already exists: {$classPath}");
47: return self::FAILURE;
48: }
49:
50: File::ensureDirectoryExists($classDir);
51:
52: $this->files->put($classPath, $this->compileStub('Ui5Resource.stub', [
53: 'phpNamespace' => $phpNamespace,
54: 'ui5Namespace' => implode('.', [$jsPrefix, Str::snake($app), 'resources', $urlKey]),
55: 'title' => Str::headline($className),
56: 'description' => "Resource for " . Str::headline($className),
57: 'slug' => $slug,
58: ]));
59: $this->files->put("{$classDir}/Provider.php", $this->compileStub('ResourceProvider.stub', [
60: 'phpNamespace' => $phpNamespace,
61: ]));
62:
63: $this->components->success("Resource created: {$classPath}");
64: $this->components->info("💡 Don’t forget to register this resource in your module");
65:
66: return self::SUCCESS;
67: }
68: }
69: