From da3046c9906eaf849a83a323fda977ad4ff53920 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Kv=C3=A1=C4=8Dek?= Date: Mon, 15 Feb 2016 10:32:19 +0100 Subject: [PATCH] FEATURE #1422: prepare application for registering widgets --- app/Enumerations/WidgetTypes.php | 21 ++++++++ app/Enumerations/WidgetTypesWithHandlers.php | 21 ++++++++ .../Registrators/WidgetRegistrator.php | 46 +++++++++++++++++ app/Providers/AppServiceProvider.php | 21 +++++++- .../Contracts/AdminDashboardWidget.php | 12 +++++ app/Widgets/Contracts/PublicWidget.php | 49 +++++++++++++++++++ app/Widgets/Contracts/WidgetRenderer.php | 37 ++++++++++++++ .../Exceptions/MissingParameterException.php | 14 ++++++ app/Widgets/NonInstallableWidget.php | 15 ++++++ app/Widgets/Widget.php | 8 +++ 10 files changed, 243 insertions(+), 1 deletion(-) create mode 100644 app/Enumerations/WidgetTypes.php create mode 100644 app/Enumerations/WidgetTypesWithHandlers.php create mode 100644 app/Handlers/Registrators/WidgetRegistrator.php create mode 100644 app/Widgets/Contracts/AdminDashboardWidget.php create mode 100644 app/Widgets/Contracts/PublicWidget.php create mode 100644 app/Widgets/Contracts/WidgetRenderer.php create mode 100644 app/Widgets/Exceptions/MissingParameterException.php create mode 100644 app/Widgets/NonInstallableWidget.php create mode 100644 app/Widgets/Widget.php diff --git a/app/Enumerations/WidgetTypes.php b/app/Enumerations/WidgetTypes.php new file mode 100644 index 00000000..60b3ad9d --- /dev/null +++ b/app/Enumerations/WidgetTypes.php @@ -0,0 +1,21 @@ +id, $widget->name); + } + } +} \ No newline at end of file diff --git a/app/Enumerations/WidgetTypesWithHandlers.php b/app/Enumerations/WidgetTypesWithHandlers.php new file mode 100644 index 00000000..3a66666f --- /dev/null +++ b/app/Enumerations/WidgetTypesWithHandlers.php @@ -0,0 +1,21 @@ +handler, $module->name); + } + } +} \ No newline at end of file diff --git a/app/Handlers/Registrators/WidgetRegistrator.php b/app/Handlers/Registrators/WidgetRegistrator.php new file mode 100644 index 00000000..36814493 --- /dev/null +++ b/app/Handlers/Registrators/WidgetRegistrator.php @@ -0,0 +1,46 @@ +widgets = WidgetTypesWithHandlers::getSimple(); + } + + /** + * Method used for registering new widgets + * + * @param $classname + */ + public function register($classname) + { + $class = new $classname; + if (!$class instanceof PublicWidget) { + throw new InvalidArgumentException($class . ' must implement PublicWidget interface.'); + } + + // register widget as new widget type + if (!in_array($classname, $this->widgets)) { + $widgetName = call_user_func($classname . '::getName'); + $widgetDescription = call_user_func($classname . '::getDescription'); + + // create row in widget types + WidgetType::create([ + 'handler' => $classname, + 'name' => $widgetName, + 'description' => $widgetDescription + ]); + } + + // install widget (if neccessary) + call_user_func($classname . '::install'); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 0bd35d0c..ac6555dc 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,6 +2,7 @@ namespace App\Providers; +use App\Handlers\Registrators\WidgetRegistrator; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider @@ -13,7 +14,7 @@ class AppServiceProvider extends ServiceProvider */ public function boot() { - // + $this->registerWidgets(); } /** @@ -31,5 +32,23 @@ class AppServiceProvider extends ServiceProvider // register PingPong module extension $this->app->register('Pingpong\Modules\ModulesServiceProvider'); $this->app->register('Pingpong\Menus\MenusServiceProvider'); + + // create singletons for registering widgets + $this->app->singleton('registerWidget', function ($app) { + return new WidgetRegistrator($app); + }); + } + + /** + * Method for registering widgets. + */ + private function registerWidgets() + { + /** + * @var $registrator WidgetRegistrator + */ + $registrator = $this->app->make('registerWidget'); + + // register all available widgets } } diff --git a/app/Widgets/Contracts/AdminDashboardWidget.php b/app/Widgets/Contracts/AdminDashboardWidget.php new file mode 100644 index 00000000..b150f0d8 --- /dev/null +++ b/app/Widgets/Contracts/AdminDashboardWidget.php @@ -0,0 +1,12 @@ + $message]); + + parent::__construct($message, $code, $previous); + } +} \ No newline at end of file diff --git a/app/Widgets/NonInstallableWidget.php b/app/Widgets/NonInstallableWidget.php new file mode 100644 index 00000000..0c568849 --- /dev/null +++ b/app/Widgets/NonInstallableWidget.php @@ -0,0 +1,15 @@ +