Support specifying enchants.config in plugin

This commit is contained in:
Pig Fang 2019-12-05 19:28:12 +08:00
parent 4cc7b4441f
commit 776e8652a0
4 changed files with 49 additions and 10 deletions

View File

@ -11,8 +11,14 @@ class PluginController extends Controller
public function config(PluginManager $plugins, $name) public function config(PluginManager $plugins, $name)
{ {
$plugin = $plugins->get($name); $plugin = $plugins->get($name);
if ($plugin && $plugin->isEnabled() && $plugin->hasConfigView()) { if ($plugin && $plugin->isEnabled()) {
return $plugin->getConfigView(); if ($plugin->hasConfigClass()) {
return app()->call($plugin->getConfigClass().'@render');
} elseif ($plugin->hasConfigView()) {
return $plugin->getConfigView();
} else {
return abort(404, trans('admin.plugins.operations.no-config-notice'));
}
} else { } else {
return abort(404, trans('admin.plugins.operations.no-config-notice')); return abort(404, trans('admin.plugins.operations.no-config-notice'));
} }
@ -89,7 +95,7 @@ class PluginController extends Controller
'version' => $plugin->version, 'version' => $plugin->version,
'url' => $plugin->url, 'url' => $plugin->url,
'enabled' => $plugin->isEnabled(), 'enabled' => $plugin->isEnabled(),
'config' => $plugin->hasConfigView(), 'config' => $plugin->hasConfig(),
'dependencies' => [ 'dependencies' => [
'all' => $plugin->require, 'all' => $plugin->require,
'unsatisfied' => $plugins->getUnsatisfied($plugin), 'unsatisfied' => $plugins->getUnsatisfied($plugin),

View File

@ -75,7 +75,7 @@ class SideMenuComposer
$pluginConfigs = resolve(PluginManager::class) $pluginConfigs = resolve(PluginManager::class)
->getEnabledPlugins() ->getEnabledPlugins()
->filter(function ($plugin) { ->filter(function ($plugin) {
return $plugin->hasConfigView(); return $plugin->hasConfig();
}) })
->map(function ($plugin) { ->map(function ($plugin) {
return [ return [

View File

@ -58,6 +58,23 @@ class Plugin
return "$baseUrl/{$this->name}/assets/$relativeUri?v=".$this->version; return "$baseUrl/{$this->name}/assets/$relativeUri?v=".$this->version;
} }
public function hasConfig(): bool
{
return $this->hasConfigClass() || $this->hasConfigView();
}
public function hasConfigClass(): bool
{
return Arr::has($this->manifest, 'enchants.config');
}
public function getConfigClass()
{
$name = Arr::get($this->manifest, 'enchants.config');
return Str::start($name, $this->manifest['namespace'].'\\');
}
public function getViewPath(string $filename): string public function getViewPath(string $filename): string
{ {
return $this->path."/views/$filename"; return $this->path."/views/$filename";

View File

@ -50,15 +50,25 @@ class PluginControllerTest extends TestCase
->with('fake4') ->with('fake4')
->once() ->once()
->andReturn($plugin); ->andReturn($plugin);
$plugin = new Plugin(resource_path(''), [
'namespace' => 'App\\Services',
'enchants' => [
'config' => 'OptionForm',
],
]);
$plugin->setEnabled(true);
$mock->shouldReceive('get')
->with('fake5')
->once()
->andReturn($plugin);
}); });
// No such plugin. // No such plugin.
$this->get('/admin/plugins/config/fake1') $this->get('/admin/plugins/config/fake1')->assertNotFound();
->assertNotFound();
// Plugin is disabled // Plugin is disabled
$this->get('/admin/plugins/config/fake2') $this->get('/admin/plugins/config/fake2')->assertNotFound();
->assertNotFound();
// Plugin is enabled but it doesn't have config view // Plugin is enabled but it doesn't have config view
$this->get('/admin/plugins/config/fake3') $this->get('/admin/plugins/config/fake3')
@ -66,8 +76,14 @@ class PluginControllerTest extends TestCase
->assertNotFound(); ->assertNotFound();
// Plugin has config view // Plugin has config view
$this->get('/admin/plugins/config/fake4') $this->get('/admin/plugins/config/fake4')->assertSuccessful();
->assertSuccessful();
// Plugin has config class
app()->instance(
\App\Services\OptionForm::class,
new \App\Services\OptionForm('t')
);
$this->get('/admin/plugins/config/fake5')->assertSee('card');
option(['plugins_enabled' => '[]']); option(['plugins_enabled' => '[]']);
} }