Viewing file: VendorPublishCommand.php (7.67 KB) -rwxrwxr-x Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
namespace Illuminate\Foundation\Console;
use Illuminate\Console\Command; use Illuminate\Filesystem\Filesystem; use Illuminate\Foundation\Events\VendorTagPublished; use Illuminate\Support\Arr; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Str; use League\Flysystem\Filesystem as Flysystem; use League\Flysystem\Local\LocalFilesystemAdapter as LocalAdapter; use League\Flysystem\MountManager; use League\Flysystem\UnixVisibility\PortableVisibilityConverter; use League\Flysystem\Visibility;
class VendorPublishCommand extends Command { /** * The filesystem instance. * * @var \Illuminate\Filesystem\Filesystem */ protected $files;
/** * The provider to publish. * * @var string */ protected $provider = null;
/** * The tags to publish. * * @var array */ protected $tags = [];
/** * The console command signature. * * @var string */ protected $signature = 'vendor:publish {--force : Overwrite any existing files} {--all : Publish assets for all service providers without prompt} {--provider= : The service provider that has assets you want to publish} {--tag=* : One or many tags that have assets you want to publish}';
/** * The name of the console command. * * This name is used to identify the command during lazy loading. * * @var string|null */ protected static $defaultName = 'vendor:publish';
/** * The console command description. * * @var string */ protected $description = 'Publish any publishable assets from vendor packages';
/** * Create a new command instance. * * @param \Illuminate\Filesystem\Filesystem $files * @return void */ public function __construct(Filesystem $files) { parent::__construct();
$this->files = $files; }
/** * Execute the console command. * * @return void */ public function handle() { $this->determineWhatShouldBePublished();
foreach ($this->tags ?: [null] as $tag) { $this->publishTag($tag); }
$this->info('Publishing complete.'); }
/** * Determine the provider or tag(s) to publish. * * @return void */ protected function determineWhatShouldBePublished() { if ($this->option('all')) { return; }
[$this->provider, $this->tags] = [ $this->option('provider'), (array) $this->option('tag'), ];
if (! $this->provider && ! $this->tags) { $this->promptForProviderOrTag(); } }
/** * Prompt for which provider or tag to publish. * * @return void */ protected function promptForProviderOrTag() { $choice = $this->choice( "Which provider or tag's files would you like to publish?", $choices = $this->publishableChoices() );
if ($choice == $choices[0] || is_null($choice)) { return; }
$this->parseChoice($choice); }
/** * The choices available via the prompt. * * @return array */ protected function publishableChoices() { return array_merge( ['<comment>Publish files from all providers and tags listed below</comment>'], preg_filter('/^/', '<comment>Provider: </comment>', Arr::sort(ServiceProvider::publishableProviders())), preg_filter('/^/', '<comment>Tag: </comment>', Arr::sort(ServiceProvider::publishableGroups())) ); }
/** * Parse the answer that was given via the prompt. * * @param string $choice * @return void */ protected function parseChoice($choice) { [$type, $value] = explode(': ', strip_tags($choice));
if ($type === 'Provider') { $this->provider = $value; } elseif ($type === 'Tag') { $this->tags = [$value]; } }
/** * Publishes the assets for a tag. * * @param string $tag * @return mixed */ protected function publishTag($tag) { $published = false;
$pathsToPublish = $this->pathsToPublish($tag);
foreach ($pathsToPublish as $from => $to) { $this->publishItem($from, $to);
$published = true; }
if ($published === false) { $this->comment('No publishable resources for tag ['.$tag.'].'); } else { $this->laravel['events']->dispatch(new VendorTagPublished($tag, $pathsToPublish)); } }
/** * Get all of the paths to publish. * * @param string $tag * @return array */ protected function pathsToPublish($tag) { return ServiceProvider::pathsToPublish( $this->provider, $tag ); }
/** * Publish the given item from and to the given location. * * @param string $from * @param string $to * @return void */ protected function publishItem($from, $to) { if ($this->files->isFile($from)) { return $this->publishFile($from, $to); } elseif ($this->files->isDirectory($from)) { return $this->publishDirectory($from, $to); }
$this->error("Can't locate path: <{$from}>"); }
/** * Publish the file to the given path. * * @param string $from * @param string $to * @return void */ protected function publishFile($from, $to) { if (! $this->files->exists($to) || $this->option('force')) { $this->createParentDirectory(dirname($to));
$this->files->copy($from, $to);
$this->status($from, $to, 'File'); } }
/** * Publish the directory to the given directory. * * @param string $from * @param string $to * @return void */ protected function publishDirectory($from, $to) { $visibility = PortableVisibilityConverter::fromArray([], Visibility::PUBLIC);
$this->moveManagedFiles(new MountManager([ 'from' => new Flysystem(new LocalAdapter($from)), 'to' => new Flysystem(new LocalAdapter($to, $visibility)), ]));
$this->status($from, $to, 'Directory'); }
/** * Move all the files in the given MountManager. * * @param \League\Flysystem\MountManager $manager * @return void */ protected function moveManagedFiles($manager) { foreach ($manager->listContents('from://', true) as $file) { $path = Str::after($file['path'], 'from://');
if ($file['type'] === 'file' && (! $manager->fileExists('to://'.$path) || $this->option('force'))) { $manager->write('to://'.$path, $manager->read($file['path'])); } } }
/** * Create the directory to house the published files if needed. * * @param string $directory * @return void */ protected function createParentDirectory($directory) { if (! $this->files->isDirectory($directory)) { $this->files->makeDirectory($directory, 0755, true); } }
/** * Write a status message to the console. * * @param string $from * @param string $to * @param string $type * @return void */ protected function status($from, $to, $type) { $from = str_replace(base_path(), '', realpath($from));
$to = str_replace(base_path(), '', realpath($to));
$this->line('<info>Copied '.$type.'</info> <comment>['.$from.']</comment> <info>To</info> <comment>['.$to.']</comment>'); } }
|