Bristol SU Support Package
ModuleServiceProvider.php
Go to the documentation of this file.
1 <?php
2 
4 
11 use Exception;
19 
25 abstract class ModuleServiceProvider extends ServiceProvider
26 {
27 
33  protected $defer = false;
34 
56  protected $permissions = [
57  ];
58 
72  protected $events = [];
73 
86  protected $commands = [];
87 
99  protected $settingListeners = [];
100 
116  protected $scheduledCommands = [];
117 
138  public function boot()
139  {
140  $this->registerTranslations();
141  $this->registerConfig();
142  $this->registerModule();
143  $this->registerPermissions();
144  $this->registerEvents();
145  $this->registerViews();
146  $this->registerFactories();
147  $this->loadMigrations();
148  $this->registerCommands();
149  $this->registerAssets();
150  $this->registerRoutes();
151  $this->registerSettings();
152  $this->registerSettingListeners();
153  $this->registerScheduledCommands();
154  }
155 
161  public function registerSettingListeners()
162  {
163  foreach ($this->settingListeners as $listener) {
164  Event::listen('eloquent.*: '.ModuleInstanceSetting::class, $listener);
165  }
166  }
167 
175  public function registerScheduledCommands()
176  {
177  $commandStore = $this->app->make(CommandStore::class);
178  foreach ($this->scheduledCommands as $command => $cron) {
179  $commandStore->schedule($this->alias(), $command, $cron);
180  }
181  }
182 
186  public function registerRoutes()
187  {
188 
189  $this->mapParticipantRoutes();
190  $this->mapAdminRoutes();
191  $this->mapParticipantApiRoutes();
192  $this->mapAdminApiRoutes();
193  }
194 
200  public function registerModule()
201  {
202  $this->app->make(ModuleManager::class)->register($this->alias());
203  }
204 
210  public function registerPermissions()
211  {
212  foreach ($this->permissions as $ability => $permission) {
213  if (!array_key_exists('name', $permission) || !array_key_exists('description', $permission)) {
214  throw new \Exception('Name and description of permission required.');
215  }
216  if (!array_key_exists('admin', $permission)) {
217  $permission['admin'] = false;
218  }
219  Permission::register($this->alias().'.'.$ability, $permission['name'], $permission['description'], $this->alias(), $permission['admin']);
220  }
221  }
222 
228  public function registerEvents()
229  {
230  $manager = $this->app->make(EventManager::class);
231  foreach ($this->events as $class => $meta) {
232  if (!array_key_exists('name', $meta) || !array_key_exists('description', $meta)) {
233  throw new \Exception('Name and description of event required.');
234  }
235  $manager->registerEvent($this->alias(), $meta['name'], $class, $meta['description']);
236  }
237  }
238 
242  public function registerTranslations()
243  {
244  $this->loadTranslationsFrom($this->baseDirectory().'/resources/lang', $this->alias());
245  }
246 
250  protected function registerConfig()
251  {
252  $this->publishes([$this->baseDirectory().'/config/config.php' => config_path($this->alias().'.php'),
253  ], 'config');
254  $this->mergeConfigFrom(
255  $this->baseDirectory().'/config/config.php', $this->alias()
256  );
257  }
258 
262  public function registerViews()
263  {
264  $this->publishes([
265  $this->baseDirectory().'/resources/views' => resource_path('views/vendor/'.$this->alias()),
266  ], 'views');
267 
268  $this->loadViewsFrom($this->baseDirectory().'/resources/views', $this->alias());
269  }
270 
276  public function registerFactories()
277  {
278  if (!app()->environment('production')) {
279  $this->app->make(Factory::class)->load($this->baseDirectory().'/database/factories');
280  }
281  }
282 
286  public function loadMigrations()
287  {
288  $this->loadMigrationsFrom($this->baseDirectory().'/database/migrations');
289  }
290 
294  public function mapParticipantRoutes()
295  {
296  Route::prefix('/p/{activity_slug}/{module_instance_slug}/'.$this->alias())
297  ->middleware(['web', 'auth', 'verified', 'module', 'activity', 'participant', 'moduleparticipant'])
298  ->namespace($this->namespace())
299  ->group($this->baseDirectory().'/routes/participant/web.php');
300  }
301 
305  public function mapAdminRoutes()
306  {
307  Route::prefix('/a/{activity_slug}/{module_instance_slug}/'.$this->alias())
308  ->middleware(['web', 'auth', 'verified', 'module', 'activity', 'administrator'])
309  ->namespace($this->namespace())
310  ->group($this->baseDirectory().'/routes/admin/web.php');
311  }
312 
316  public function mapParticipantApiRoutes()
317  {
318  Route::prefix('/api/p/{activity_slug}/{module_instance_slug}/'.$this->alias())
319  ->middleware(['api', 'auth', 'verified', 'module', 'activity', 'participant', 'moduleparticipant'])
320  ->namespace($this->namespace())
321  ->group($this->baseDirectory().'/routes/participant/api.php');
322  }
323 
327  public function mapAdminApiRoutes()
328  {
329  Route::prefix('/api/a/{activity_slug}/{module_instance_slug}/'.$this->alias())
330  ->middleware(['api', 'auth', 'verified', 'module', 'activity', 'administrator'])
331  ->namespace($this->namespace())
332  ->group($this->baseDirectory().'/routes/admin/api.php');
333  }
334 
338  public function registerCommands()
339  {
340  if ($this->app->runningInConsole()) {
341  $this->commands($this->commands);
342  }
343  }
344 
348  public function registerAssets()
349  {
350  $this->publishes([$this->baseDirectory().'/public/modules/'.$this->alias() => public_path('modules/'.$this->alias())]);
351  }
352 
361  abstract public function namespace();
362 
370  abstract public function baseDirectory();
371 
377  abstract public function alias(): string;
378 
384  abstract public function settings(): Form;
385 
391  public function registerSettings()
392  {
393  $this->app->make(ModuleSettingsStore::class)->register($this->alias(), $this->settings());
394  }
395 
404  public function registerGlobalScript(string $path) {
405  View::composer('bristolsu::base', function(\Illuminate\View\View $view) use ($path) {
406  $scripts = ($view->offsetExists('globalScripts') ? $view->offsetGet('globalScripts') : []);
407  $scripts[] = asset($path);
408  $view->with('globalScripts', $scripts);
409  });
410  }
411 
412 }
baseDirectory()
registerGlobalScript(string $path)