|
@@ -4,12 +4,19 @@ namespace Dcat\Admin\Extend;
|
|
|
|
|
|
use Dcat\Admin\Admin;
|
|
|
use Dcat\Admin\Support\Composer;
|
|
|
+use Dcat\Test\Test;
|
|
|
+use Illuminate\Contracts\Container\Container;
|
|
|
use Illuminate\Support\Collection;
|
|
|
use RecursiveDirectoryIterator;
|
|
|
use RecursiveIteratorIterator;
|
|
|
|
|
|
class Manager
|
|
|
{
|
|
|
+ /**
|
|
|
+ * @var Container
|
|
|
+ */
|
|
|
+ protected $app;
|
|
|
+
|
|
|
/**
|
|
|
* @var ServiceProvider[]|Collection
|
|
|
*/
|
|
@@ -20,83 +27,125 @@ class Manager
|
|
|
*/
|
|
|
protected $extensionPaths = [];
|
|
|
|
|
|
- public function __construct()
|
|
|
+ public function __construct(Container $app)
|
|
|
{
|
|
|
+ $this->app = $app;
|
|
|
+
|
|
|
$this->extensions = new Collection();
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 注册扩展.
|
|
|
+ *
|
|
|
+ * @return void
|
|
|
+ */
|
|
|
+ public function register()
|
|
|
+ {
|
|
|
+ $this->load();
|
|
|
+
|
|
|
+ $this->extensions->each->register();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 初始化扩展.
|
|
|
+ */
|
|
|
+ public function boot()
|
|
|
+ {
|
|
|
+ foreach ($this->extensions as $extension) {
|
|
|
+ if ($extension->enabled()) {
|
|
|
+ $extension->boot();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 加载扩展,注册自动加载规则.
|
|
|
*
|
|
|
* @return void
|
|
|
*/
|
|
|
- public function load()
|
|
|
+ protected function load()
|
|
|
{
|
|
|
foreach ($this->getExtensionDirectories() as $directory) {
|
|
|
$this->loadExtension($directory);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取所有扩展.
|
|
|
+ *
|
|
|
+ * @return ServiceProvider[]|Collection
|
|
|
+ */
|
|
|
+ public function extensions()
|
|
|
+ {
|
|
|
+ return $this->extensions;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取已启用的扩展.
|
|
|
+ *
|
|
|
+ * @return ServiceProvider[]|Collection
|
|
|
+ */
|
|
|
+ public function availableExtensions()
|
|
|
+ {
|
|
|
+ return $this->extensions()->filter(function (ServiceProvider $extension) {
|
|
|
+ return $extension->enabled();
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 加载扩展.
|
|
|
*
|
|
|
* @param string $directory
|
|
|
+ * @param bool $addPsr4
|
|
|
+ *
|
|
|
+ * @return ServiceProvider|null
|
|
|
*/
|
|
|
- public function loadExtension(string $directory)
|
|
|
+ public function loadExtension(string $directory, bool $addPsr4 = true)
|
|
|
{
|
|
|
if (array_key_exists($directory, $this->extensionPaths)) {
|
|
|
return $this->extensionPaths[$directory];
|
|
|
}
|
|
|
- $this->extensionPaths[$directory] = null;
|
|
|
-
|
|
|
- $composerProperty = Composer::parse($directory.'/composer.json');
|
|
|
-
|
|
|
- $serviceProvider = $composerProperty->get('dcat-admin.provider');
|
|
|
- $psr4 = $composerProperty->get('autoload.psr-4');
|
|
|
-
|
|
|
- if (! $serviceProvider || ! $psr4) {
|
|
|
- return;
|
|
|
- }
|
|
|
|
|
|
- if (! class_exists($serviceProvider)) {
|
|
|
- $classLoader = Admin::classLoader();
|
|
|
+ $this->extensionPaths[$directory] = $serviceProvider = $this->resolveExtension($directory, $addPsr4);
|
|
|
|
|
|
- foreach ($psr4 as $namespace => $path) {
|
|
|
- //dd($namespace, $directory.'/'.trim($path, '/').'/');
|
|
|
- $classLoader->addPsr4($namespace, $directory.'/'.trim($path, '/').'/');
|
|
|
- }
|
|
|
+ if ($serviceProvider) {
|
|
|
+ $this->addExtension($serviceProvider);
|
|
|
}
|
|
|
|
|
|
- /* @var ServiceProvider $serviceProvider */
|
|
|
- $serviceProvider = new $serviceProvider();
|
|
|
-
|
|
|
- $this->extensions->put($serviceProvider->name(), $serviceProvider);
|
|
|
-
|
|
|
- $this->extensionPaths[$directory] = $serviceProvider;
|
|
|
-
|
|
|
return $serviceProvider;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 注册扩展.
|
|
|
+ * 获取扩展类实例.
|
|
|
*
|
|
|
- * @return void
|
|
|
+ * @param string $directory
|
|
|
+ * @param bool $addPsr4
|
|
|
+ *
|
|
|
+ * @return ServiceProvider
|
|
|
*/
|
|
|
- public function register()
|
|
|
+ public function resolveExtension(string $directory, bool $addPsr4 = true)
|
|
|
{
|
|
|
- foreach ($this->extensions as $extension) {
|
|
|
- $extension->register();
|
|
|
+ $composerProperty = Composer::parse($directory.'/composer.json');
|
|
|
+
|
|
|
+ $serviceProvider = $composerProperty->get('dcat-admin.provider');
|
|
|
+ $psr4 = $composerProperty->get('autoload.psr-4');
|
|
|
+
|
|
|
+ if (! $serviceProvider || ! $psr4) {
|
|
|
+ return;
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- public function boot()
|
|
|
- {
|
|
|
- foreach ($this->extensions as $extension) {
|
|
|
- $extension->boot();
|
|
|
+ if ($addPsr4) {
|
|
|
+ $this->registerPsr4($directory, $psr4);
|
|
|
}
|
|
|
+
|
|
|
+ $serviceProvider = new $serviceProvider($this->app);
|
|
|
+
|
|
|
+ return $serviceProvider->withComposerProperty($composerProperty);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * 获取扩展目录.
|
|
|
+ *
|
|
|
* @return array
|
|
|
*/
|
|
|
public function getExtensionDirectories()
|
|
@@ -125,4 +174,20 @@ class Manager
|
|
|
|
|
|
return $extensions;
|
|
|
}
|
|
|
+
|
|
|
+ public function addExtension(ServiceProvider $serviceProvider)
|
|
|
+ {
|
|
|
+ $this->extensions->put($serviceProvider->name(), $serviceProvider);
|
|
|
+ }
|
|
|
+
|
|
|
+ protected function registerPsr4($directory, array $psr4)
|
|
|
+ {
|
|
|
+ $classLoader = Admin::classLoader();
|
|
|
+
|
|
|
+ foreach ($psr4 as $namespace => $path) {
|
|
|
+ $path = $directory.'/'.trim($path, '/').'/';
|
|
|
+
|
|
|
+ $classLoader->addPsr4($namespace, $path);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|