files = $files;
}
public function handle()
{
$options = [];
if ($this->option('force')) {
$options['--force'] = true;
}
$tags = $this->getTags();
foreach ($tags as $tag) {
$this->call('vendor:publish', $options + ['--tag' => $tag]);
}
foreach ($this->tags as $tag) {
$this->publishTag($tag);
}
$this->call('view:clear');
}
protected function getTags()
{
$tags = [];
if ($this->option('lang')) {
$this->tags[] = 'dcat-admin-lang';
}
if ($this->option('migrations')) {
$tags[] = 'dcat-admin-migrations';
}
if ($this->option('assets')) {
$tags[] = 'dcat-admin-assets';
}
if ($this->option('config')) {
$tags[] = 'dcat-admin-config';
}
// 设置默认标签.
if (! $tags && ! $this->tags) {
$this->tags[] = 'dcat-admin-lang';
$tags = [
'dcat-admin-migrations',
'dcat-admin-assets',
'dcat-admin-config',
];
}
return $tags;
}
protected function publishTag($tag)
{
$published = false;
foreach ($this->pathsToPublish($tag) as $from => $to) {
$this->publishItem($from, $to);
$published = true;
}
if ($published) {
$this->info('Publishing complete.');
} else {
$this->error('Unable to locate publishable resources.');
}
}
protected function pathsToPublish($tag)
{
return ServiceProvider::pathsToPublish(null, $tag);
}
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}>");
}
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');
}
}
protected function publishDirectory($from, $to)
{
$localClass = class_exists(LocalAdapter::class) ? LocalAdapter::class : LocalFilesystemAdapter::class;
$this->moveManagedFiles(new MountManager([
'from' => new Flysystem(new $localClass($from)),
'to' => new Flysystem(new $localClass($to)),
]));
$this->status($from, $to, 'Directory');
}
protected function moveManagedFiles(MountManager $manager)
{
if (method_exists($manager, 'put')) {
foreach ($manager->listContents('from://', true) as $file) {
if (
$file['type'] === 'file'
&& (! $manager->has('to://'.$file['path']) || $this->option('force'))
&& ! $this->isExceptPath($manager, $file['path'])
) {
$manager->put('to://'.$file['path'], $manager->read('from://'.$file['path']));
}
}
return;
}
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']));
}
}
}
protected function isExceptPath($manager, $path)
{
return $manager->has('to://'.$path) && Str::contains($path, ['/menu.php', '/global.php']);
}
protected function createParentDirectory($directory)
{
if (! $this->files->isDirectory($directory)) {
$this->files->makeDirectory($directory, 0755, true);
}
}
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.']');
}
}