Bladeren bron

扩展添加菜单功能优化

jqh 4 jaren geleden
bovenliggende
commit
61ddcf53ea

+ 1 - 1
src/Admin.php

@@ -29,7 +29,7 @@ class Admin
     use HasAssets;
     use HasHtml;
 
-    const VERSION = '2.0.5-beta';
+    const VERSION = '2.0.6-beta';
 
     const SECTION = [
         // 往 <head> 标签内输入内容

+ 2 - 4
src/Console/ExtensionUninstallCommand.php

@@ -7,7 +7,7 @@ use Illuminate\Console\Command;
 
 class ExtensionUninstallCommand extends Command
 {
-    protected $signature = 'admin:ext-uninstall 
+    protected $signature = 'admin:ext-uninstall 
     {name : The name of the extension. Eg: author-name/extension-name}';
 
     protected $description = 'Uninstall an existing extension';
@@ -23,9 +23,7 @@ class ExtensionUninstallCommand extends Command
                 Admin::extension()
                     ->updateManager()
                     ->setOutPut($this->output)
-                    ->rollback($name);
-
-                Admin::extension()->get($name)->uninstall();
+                    ->uninstall($name);
             } catch (\Throwable $exception) {
                 $lastVersion = Admin::extension()->versionManager()->getCurrentVersion($name);
 

+ 31 - 5
src/Extend/CanImportMenu.php

@@ -10,6 +10,8 @@ use Illuminate\Support\Facades\Validator;
  */
 trait CanImportMenu
 {
+    protected $menu = [];
+
     protected $menuValidationRules = [
         'parent' => 'nullable',
         'title'  => 'required',
@@ -17,6 +19,16 @@ trait CanImportMenu
         'icon'   => 'nullable',
     ];
 
+    /**
+     * 获取菜单节点.
+     *
+     * @return array
+     */
+    protected function menu()
+    {
+        return $this->menu;
+    }
+
     /**
      * 添加菜单
      *
@@ -24,8 +36,10 @@ trait CanImportMenu
      *
      * @throws \Exception
      */
-    protected function addMenu(array $menu)
+    protected function addMenu(array $menu = [])
     {
+        $menu = $menu ?: $this->menu();
+
         if (! Arr::isAssoc($menu)) {
             foreach ($menu as $v) {
                 $this->addMenu($v);
@@ -47,11 +61,23 @@ trait CanImportMenu
                 'title'     => $menu['title'],
                 'icon'      => (string) ($icon ?? ''),
                 'uri'       => (string) ($menu['uri'] ?? ''),
-                'extension' => $this->getExtensionName(),
+                'extension' => $this->getName(),
             ]);
         }
     }
 
+    /**
+     * 刷新菜单.
+     *
+     * @throws \Exception
+     */
+    protected function refreshMenu()
+    {
+        $this->flushMenu();
+
+        $this->addMenu();
+    }
+
     /**
      * 根据名称获取菜单ID.
      *
@@ -69,14 +95,14 @@ trait CanImportMenu
 
         return $menuModel::query()
             ->where('title', $parent)
-            ->where('extension', $this->getExtensionName())
+            ->where('extension', $this->getName())
             ->value('id') ?: 0;
     }
 
     /**
      * 删除菜单.
      */
-    protected function deleteMenu()
+    protected function flushMenu()
     {
         $menuModel = $this->getMenuModel();
 
@@ -85,7 +111,7 @@ trait CanImportMenu
         }
 
         $menuModel::query()
-            ->where('extension', $this->getExtensionName())
+            ->where('extension', $this->getName())
             ->delete();
     }
 

+ 27 - 7
src/Extend/ServiceProvider.php

@@ -11,6 +11,8 @@ use Symfony\Component\Console\Output\NullOutput;
 
 abstract class ServiceProvider extends LaravelServiceProvider
 {
+    use CanImportMenu;
+
     const TYPE_THEME = 'theme';
 
     /**
@@ -108,7 +110,7 @@ abstract class ServiceProvider extends LaravelServiceProvider
             $this->registerRoutes($routes);
         }
 
-        if ($this->middleware) {
+        if ($this->middleware()) {
             $this->addMiddleware();
         }
 
@@ -295,9 +297,15 @@ abstract class ServiceProvider extends LaravelServiceProvider
 
     /**
      * 更新扩展.
+     *
+     * @param $currentVersion
+     * @param $stopOnVersion
+     *
+     * @throws \Exception
      */
-    public function update()
+    public function update($currentVersion, $stopOnVersion)
     {
+        $this->refreshMenu();
     }
 
     /**
@@ -305,6 +313,7 @@ abstract class ServiceProvider extends LaravelServiceProvider
      */
     public function uninstall()
     {
+        $this->flushMenu();
     }
 
     /**
@@ -346,21 +355,32 @@ abstract class ServiceProvider extends LaravelServiceProvider
         });
     }
 
+    /**
+     * 获取中间件.
+     *
+     * @return array
+     */
+    protected function middleware()
+    {
+        return $this->middleware;
+    }
+
     /**
      * 注册中间件.
      */
     protected function addMiddleware()
     {
-        $middleware = (array) config('admin.route.middleware');
+        $adminMiddleware = (array) config('admin.route.middleware');
+        $middleware = $this->middleware();
 
-        $before = $this->middleware['before'] ?? [];
-        $middle = $this->middleware['middle'] ?? [];
-        $after = $this->middleware['after'] ?? [];
+        $before = $middleware['before'] ?? [];
+        $middle = $middleware['middle'] ?? [];
+        $after = $middleware['after'] ?? [];
 
         $this->mixMiddleware($middle);
 
         config([
-            'admin.route.middleware' => array_merge((array) $before, $middleware, (array) $after),
+            'admin.route.middleware' => array_merge((array) $before, $adminMiddleware, (array) $after),
         ]);
     }
 

+ 0 - 2
src/Extend/UpdateManager.php

@@ -84,8 +84,6 @@ class UpdateManager
             return;
         }
 
-        $extension->update();
-
         $this->note($name);
 
         $this->versionUpdate($extension, $stopOnVersion);

+ 5 - 1
src/Extend/VersionManager.php

@@ -51,6 +51,8 @@ class VersionManager
             return;
         }
 
+        $this->manager->get($extension)->update($databaseVersion, $stopOnVersion ?: $currentVersion);
+
         $newUpdates = $this->getNewFileVersions($name, $databaseVersion);
 
         foreach ($newUpdates as $version => $details) {
@@ -304,7 +306,7 @@ class VersionManager
         $updateFile = $this->manager->path($name, 'updates/'.$script);
 
         if (! is_file($updateFile)) {
-            $this->note('- <error>v'.$version.':  Migration file "'.$script.'" not found</error>');
+            $this->note(sprintf('- <error>v%s:  Migration file "%s" not found</error>', $version, $script));
 
             return;
         }
@@ -317,6 +319,8 @@ class VersionManager
                 'detail'  => $script,
             ]);
         });
+
+        $this->note(sprintf('- <info>v%s:  Migrated</info> %s', $version, $script));
     }
 
     protected function resolveUpdater($name, $updateFile)