jqh 4 سال پیش
والد
کامیت
9b17ee0255

+ 4 - 4
src/Admin.php

@@ -335,7 +335,7 @@ class Admin
      */
     public static function booting($callback)
     {
-        Event::listen('admin.booting', $callback);
+        Event::listen('admin:booting', $callback);
     }
 
     /**
@@ -343,7 +343,7 @@ class Admin
      */
     public static function booted($callback)
     {
-        Event::listen('admin.booted', $callback);
+        Event::listen('admin:booted', $callback);
     }
 
     /**
@@ -351,7 +351,7 @@ class Admin
      */
     public static function callBooting()
     {
-        Event::dispatch('admin.booting');
+        Event::dispatch('admin:booting');
     }
 
     /**
@@ -359,7 +359,7 @@ class Admin
      */
     public static function callBooted()
     {
-        Event::dispatch('admin.booted');
+        Event::dispatch('admin:booted');
     }
 
     /**

+ 10 - 4
src/AdminServiceProvider.php

@@ -82,6 +82,7 @@ class AdminServiceProvider extends ServiceProvider
         $this->bootApplication();
         $this->registerPublishing();
         $this->compatibleBlade();
+        $this->bootExtensions();
     }
 
     public function register()
@@ -92,7 +93,7 @@ class AdminServiceProvider extends ServiceProvider
         $this->loadAdminAuthConfig();
         $this->registerRouteMiddleware();
         $this->registerServices();
-        $this->loadExtensions();
+        $this->registerExtensions();
 
         $this->commands($this->commands);
 
@@ -212,14 +213,19 @@ class AdminServiceProvider extends ServiceProvider
         $this->app->singleton('admin.menu', Menu::class);
         $this->app->singleton('admin.context', Fluent::class);
         $this->app->singleton('admin.setting', function () {
-            return Setting::from();
+            return Setting::fromDatabase();
         });
         $this->app->singleton('admin.web-uploader', WebUploader::class);
     }
 
-    protected function loadExtensions()
+    protected function registerExtensions()
     {
-        Admin::extensions()->load();
+        Admin::extensions()->register();
+    }
+
+    protected function bootExtensions()
+    {
+        Admin::extensions()->boot();
     }
 
     /**

+ 101 - 36
src/Extend/Manager.php

@@ -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);
+        }
+    }
 }

+ 31 - 6
src/Extend/ServiceProvider.php

@@ -3,6 +3,7 @@
 namespace Dcat\Admin\Extend;
 
 use Dcat\Admin\Admin;
+use Dcat\Admin\Support\ComposerProperty;
 use Illuminate\Support\Arr;
 use Illuminate\Support\Facades\Validator;
 use Illuminate\Support\ServiceProvider as LaravelServiceProvider;
@@ -10,7 +11,15 @@ use Symfony\Component\Console\Output\NullOutput;
 
 abstract class ServiceProvider extends LaravelServiceProvider
 {
-    const NAME = null;
+    /**
+     * @var ComposerProperty
+     */
+    protected $composerProperty;
+
+    /**
+     * @var string
+     */
+    protected $name;
 
     /**
      * @var string
@@ -63,11 +72,11 @@ abstract class ServiceProvider extends LaravelServiceProvider
     public function boot()
     {
         if ($views = $this->views()) {
-            $this->loadViewsFrom($views, static::NAME);
+            $this->loadViewsFrom($views, $this->name());
         }
 
         if ($lang = $this->lang()) {
-            $this->loadTranslationsFrom($lang, static::NAME);
+            $this->loadTranslationsFrom($lang, $this->name());
         }
 
         if ($migrations = $this->migrations()) {
@@ -80,13 +89,13 @@ abstract class ServiceProvider extends LaravelServiceProvider
     }
 
     /**
-     * 获取扩展名称.
+     * 获取扩展名称.
      *
      * @return string
      */
     final public function name()
     {
-        return static::NAME;
+        return $this->name ?: ($this->name = str_replace('/', '.', $this->composerProperty->name));
     }
 
     /**
@@ -120,6 +129,7 @@ abstract class ServiceProvider extends LaravelServiceProvider
      */
     final public function enabled()
     {
+        return in_array($this->name(), Admin::setting()->getExtensionsEnabled(), true);
     }
 
     /**
@@ -127,8 +137,9 @@ abstract class ServiceProvider extends LaravelServiceProvider
      *
      * @return bool
      */
-    final public function disable()
+    final public function disabled()
     {
+        return ! $this->enabled();
     }
 
     /**
@@ -141,6 +152,9 @@ abstract class ServiceProvider extends LaravelServiceProvider
      */
     final public function config($key = null, $default = null)
     {
+
+
+
     }
 
     /**
@@ -250,6 +264,17 @@ abstract class ServiceProvider extends LaravelServiceProvider
         return $this->permission;
     }
 
+    /**
+     * @param ComposerProperty $composerProperty
+     *
+     * @return $this
+     */
+    public function withComposerProperty(ComposerProperty $composerProperty)
+    {
+        $this->composerProperty = $composerProperty;
+
+        return $this;
+    }
 
     /**
      * 导入菜单.

+ 1 - 0
src/Form/Field/WebUploader.php

@@ -189,6 +189,7 @@ trait WebUploader
             'fileSingleSizeLimit' => 10485760, // 10M
             'elementName'         => $this->getElementName(), // 字段name属性值
             'lang'                => trans('admin.uploader'),
+            'compress'            => false,
 
             'deleteData' => [
                 static::FILE_DELETE_FLAG => '',

+ 2 - 0
src/Models/Setting.php

@@ -6,5 +6,7 @@ use Illuminate\Database\Eloquent\Model;
 
 class Setting extends Model
 {
+    protected $table = 'admin_settings';
+
     protected $fillable = ['slug', 'value'];
 }

+ 37 - 4
src/Support/Setting.php

@@ -3,18 +3,51 @@
 namespace Dcat\Admin\Support;
 
 use Dcat\Admin\Models\Setting as Model;
+use Illuminate\Database\QueryException;
 use Illuminate\Support\Arr;
 use Illuminate\Support\Fluent;
 
 class Setting extends Fluent
 {
-    public static function from()
+    /**
+     * 获取配置.
+     *
+     * @param string $key
+     * @param null $default
+     *
+     * @return mixed
+     */
+    public function get($key, $default = null)
     {
-        return new static(Model::pluck('value', 'slug')->toArray());
+        return Arr::get($this->attributes, $key, $default);
     }
 
-    public function get($key, $default = null)
+    /**
+     * 获取启用的扩展.
+     *
+     * @return array
+     */
+    public function getExtensionsEnabled()
     {
-        return Arr::get($this->attributes, $key, $default);
+        $value = $this->get('extensions_enabled') ?: '[]';
+
+        $value = json_decode($value, true);
+
+        return $value ?: [];
+    }
+
+    /**
+     * @return static
+     */
+    public static function fromDatabase()
+    {
+        $values = [];
+
+        try {
+            $values = Model::pluck('value', 'slug')->toArray();
+        } catch (QueryException $e) {
+        }
+
+        return new static($values);
     }
 }

+ 5 - 5
src/Traits/HasBuilderEvents.php

@@ -6,22 +6,22 @@ trait HasBuilderEvents
 {
     public static function resolving(callable $callback, bool $once = false)
     {
-        static::addBuilderListeners('builder.resolving', $callback, $once);
+        static::addBuilderListeners('builder:resolving', $callback, $once);
     }
 
     protected function callResolving(...$params)
     {
-        $this->fireBuilderEvent('builder.resolving', ...$params);
+        $this->fireBuilderEvent('builder:resolving', ...$params);
     }
 
     public static function composing(callable $callback, bool $once = false)
     {
-        static::addBuilderListeners('builder.composing', $callback, $once);
+        static::addBuilderListeners('builder:composing', $callback, $once);
     }
 
     protected function callComposing(...$params)
     {
-        $this->fireBuilderEvent('builder.composing', ...$params);
+        $this->fireBuilderEvent('builder:composing', ...$params);
     }
 
     protected function fireBuilderEvent($key, ...$params)
@@ -60,6 +60,6 @@ trait HasBuilderEvents
 
     protected static function formatBuilderEventKey($key)
     {
-        return static::class.'::'.$key;
+        return static::class.':'.$key;
     }
 }

+ 2 - 4
src/Widgets/Form.php

@@ -678,15 +678,13 @@ HTML;
     }
 
     /**
-     * Disable submit with ajax.
-     *
      * @param bool $disable
      *
      * @return $this
      */
-    public function disableAjaxSubmit(bool $disable = true)
+    public function ajax(bool $value = true)
     {
-        $this->useAjaxSubmit = ! $disable;
+        $this->useAjaxSubmit = $value;
 
         return $this;
     }

+ 1 - 1
tests/Controllers/PainterController.php

@@ -2,9 +2,9 @@
 
 namespace Tests\Controllers;
 
-use Dcat\Admin\Controllers\AdminController;
 use Dcat\Admin\Form;
 use Dcat\Admin\Grid;
+use Dcat\Admin\Http\Controllers\AdminController;
 use Dcat\Admin\Show;
 use Tests\Models\Painter;
 

+ 3 - 6
tests/Controllers/UserController.php

@@ -2,19 +2,16 @@
 
 namespace Tests\Controllers;
 
-use App\Http\Controllers\Controller;
-use Dcat\Admin\Controllers\HasResourceActions;
 use Dcat\Admin\Form;
 use Dcat\Admin\Grid;
+use Dcat\Admin\Http\Controllers\AdminController;
 use Dcat\Admin\Layout\Content;
 use Dcat\Admin\Show;
 use Tests\Models\Tag;
 use Tests\Repositories\User;
 
-class UserController extends Controller
+class UserController extends AdminController
 {
-    use HasResourceActions;
-
     /**
      * Index interface.
      *
@@ -35,7 +32,7 @@ class UserController extends Controller
      *
      * @return Content
      */
-    public function edit(Content $content, $id)
+    public function edit($id, Content $content)
     {
         $content->header('Edit user');
         $content->description('description');