files = $files;
}
/**
* Execute the console command.
*
* @return void
*/
public function fire()
{
$tags = $this->option('tag');
$tags = $tags ?: [null];
foreach ($tags as $tag) {
$this->publishTag($tag);
}
}
/**
* Publishes the assets for a tag.
*
* @param string $tag
* @return mixed
*/
private function publishTag($tag)
{
$paths = ServiceProvider::pathsToPublish(
$this->option('provider'), $tag
);
if (empty($paths)) {
return $this->comment("Nothing to publish for tag [{$tag}].");
}
foreach ($paths as $from => $to) {
if ($this->files->isFile($from)) {
$this->publishFile($from, $to);
} elseif ($this->files->isDirectory($from)) {
$this->publishDirectory($from, $to);
} else {
$this->error("Can't locate path: <{$from}>");
}
}
$this->info("Publishing complete for tag [{$tag}]!");
}
/**
* 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')) {
return;
}
$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)
{
$manager = new MountManager([
'from' => new Flysystem(new LocalAdapter($from)),
'to' => new Flysystem(new LocalAdapter($to)),
]);
foreach ($manager->listContents('from://', true) as $file) {
if ($file['type'] === 'file' && (! $manager->has('to://'.$file['path']) || $this->option('force'))) {
$manager->put('to://'.$file['path'], $manager->read('from://'.$file['path']));
}
}
$this->status($from, $to, 'Directory');
}
/**
* 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('Copied '.$type.' ['.$from.'] To ['.$to.']');
}
}