option('view')) { return $this->writeView(); } if (parent::handle() === false && ! $this->option('force')) { return false; } if (! $this->option('inline')) { $this->writeView(); } } /** * Write the view for the component. * * @return void */ protected function writeView() { $path = $this->viewPath( str_replace('.', '/', $this->getView()).'.blade.php' ); if (! $this->files->isDirectory(dirname($path))) { $this->files->makeDirectory(dirname($path), 0777, true, true); } if ($this->files->exists($path) && ! $this->option('force')) { $this->components->error('View already exists.'); return; } file_put_contents( $path, '
' ); $this->components->info(sprintf('%s [%s] created successfully.', 'View', $path)); } /** * Build the class with the given name. * * @param string $name * @return string */ protected function buildClass($name) { if ($this->option('inline')) { return str_replace( ['DummyView', '{{ view }}'], "<<<'blade'\n
\n \n
\nblade", parent::buildClass($name) ); } return str_replace( ['DummyView', '{{ view }}'], 'view(\''.$this->getView().'\')', parent::buildClass($name) ); } /** * Get the view name relative to the view path. * * @return string view */ protected function getView() { $segments = explode('/', str_replace('\\', '/', $this->argument('name'))); $name = array_pop($segments); $path = is_string($this->option('path')) ? explode('/', trim($this->option('path'), '/')) : [ 'components', ...$segments, ]; $path[] = $name; return (new Collection($path)) ->map(fn ($segment) => Str::kebab($segment)) ->implode('.'); } /** * Get the stub file for the generator. * * @return string */ protected function getStub() { return $this->resolveStubPath('/stubs/view-component.stub'); } /** * Resolve the fully-qualified path to the stub. * * @param string $stub * @return string */ protected function resolveStubPath($stub) { return file_exists($customPath = $this->laravel->basePath(trim($stub, '/'))) ? $customPath : __DIR__.$stub; } /** * Get the default namespace for the class. * * @param string $rootNamespace * @return string */ protected function getDefaultNamespace($rootNamespace) { return $rootNamespace.'\View\Components'; } /** * Get the console command options. * * @return array */ protected function getOptions() { return [ ['inline', null, InputOption::VALUE_NONE, 'Create a component that renders an inline view'], ['view', null, InputOption::VALUE_NONE, 'Create an anonymous component with only a view'], ['path', null, InputOption::VALUE_REQUIRED, 'The location where the component view should be created'], ['force', 'f', InputOption::VALUE_NONE, 'Create the class even if the component already exists'], ]; } }