4
0
Fork 0
dcat-admin/src/Console/PublishCommand.php

205 lines
5.5 KiB
PHP
Executable File

<?php
namespace Dcat\Admin\Console;
use Illuminate\Console\Command;
use Illuminate\Filesystem\Filesystem;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Str;
use League\Flysystem\Adapter\Local as LocalAdapter;
use League\Flysystem\Filesystem as Flysystem;
use League\Flysystem\Local\LocalFilesystemAdapter;
use League\Flysystem\MountManager;
class PublishCommand extends Command
{
/**
* The console command name.
*
* @var string
*/
protected $signature = 'admin:publish
{--force : Overwrite any existing files}
{--lang : Publish language files}
{--assets : Publish assets files}
{--migrations : Publish migrations files}
{--config : Publish configuration files}';
/**
* The console command description.
*
* @var string
*/
protected $description = "Re-publish dcat-admin's assets, configuration, language and migration files. If you want overwrite the existing files, you can add the `--force` option";
/**
* @var \Illuminate\Filesystem\Filesystem
*/
protected $files;
/**
* @var array
*/
protected $tags = [];
public function __construct(Filesystem $files)
{
parent::__construct();
$this->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('<info>Copied '.$type.'</info> <comment>['.$from.']</comment> <info>To</info> <comment>['.$to.']</comment>');
}
}