argument('name') ?? $this->askRequired('Name (e.g. `Settings`)', 'name')) ->trim('/') ->trim('\\') ->trim(' ') ->replace('/', '\\'); $pageClass = (string) Str::of($page)->afterLast('\\'); $pageNamespace = Str::of($page)->contains('\\') ? (string) Str::of($page)->beforeLast('\\') : ''; $resource = null; $resourceClass = null; $resourcePage = null; $resourceInput = $this->option('resource') ?? $this->ask('(Optional) Resource (e.g. `UserResource`)'); if ($resourceInput !== null) { $resource = (string) Str::of($resourceInput) ->studly() ->trim('/') ->trim('\\') ->trim(' ') ->replace('/', '\\'); if (! Str::of($resource)->endsWith('Resource')) { $resource .= 'Resource'; } $resourceClass = (string) Str::of($resource) ->afterLast('\\'); $resourcePage = $this->option('type') ?? $this->choice( 'Which type of page would you like to create?', [ 'custom' => 'Custom', 'ListRecords' => 'List', 'CreateRecord' => 'Create', 'EditRecord' => 'Edit', 'ViewRecord' => 'View', 'ManageRecords' => 'Manage', ], 'custom', ); } $view = Str::of($page) ->prepend( (string) Str::of($resource === null ? "{$namespace}\\" : "{$resourceNamespace}\\{$resource}\\pages\\") ->replace('App\\', '') ) ->replace('\\', '/') ->explode('/') ->map(fn ($segment) => Str::lower(Str::kebab($segment))) ->implode('.'); $path = (string) Str::of($page) ->prepend('/') ->prepend($resource === null ? $path : "{$resourcePath}\\{$resource}\\Pages\\") ->replace('\\', '/') ->replace('//', '/') ->append('.php'); $viewPath = resource_path( (string) Str::of($view) ->replace('.', '/') ->prepend('views/') ->append('.blade.php'), ); $files = array_merge( [$path], $resourcePage === 'custom' ? [$viewPath] : [], ); if (! $this->option('force') && $this->checkForCollision($files)) { return static::INVALID; } if ($resource === null) { $this->copyStubToApp('Page', $path, [ 'class' => $pageClass, 'namespace' => $namespace . ($pageNamespace !== '' ? "\\{$pageNamespace}" : ''), 'view' => $view, ]); } else { $this->copyStubToApp($resourcePage === 'custom' ? 'CustomResourcePage' : 'ResourcePage', $path, [ 'baseResourcePage' => 'Filament\\Resources\\Pages\\' . ($resourcePage === 'custom' ? 'Page' : $resourcePage), 'baseResourcePageClass' => $resourcePage === 'custom' ? 'Page' : $resourcePage, 'namespace' => "{$resourceNamespace}\\{$resource}\\Pages" . ($pageNamespace !== '' ? "\\{$pageNamespace}" : ''), 'resource' => "{$resourceNamespace}\\{$resource}", 'resourceClass' => $resourceClass, 'resourcePageClass' => $pageClass, 'view' => $view, ]); } if ($resource === null || $resourcePage === 'custom') { $this->copyStubToApp('PageView', $viewPath); } $this->info("Successfully created {$page}!"); if ($resource !== null) { $this->info("Make sure to register the page in `{$resourceClass}::getPages()`."); } return static::SUCCESS; } }