107 lines
3.1 KiB
PHP
107 lines
3.1 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @file classes/core/EventServiceProvider.php
|
|
*
|
|
* Copyright (c) 2014-2021 Simon Fraser University
|
|
* Copyright (c) 2000-2021 John Willinsky
|
|
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
|
*
|
|
* @class EventServiceProvider
|
|
*
|
|
* @ingroup core
|
|
*
|
|
* @brief Registers Events Service Provider and boots data on events and their listeners
|
|
*/
|
|
|
|
namespace PKP\core;
|
|
|
|
use DateInterval;
|
|
use Illuminate\Foundation\Events\DiscoverEvents;
|
|
use Illuminate\Foundation\Support\Providers\EventServiceProvider as LaravelEventServiceProvider;
|
|
use Illuminate\Support\Facades\Cache;
|
|
use SplFileInfo;
|
|
|
|
class EventServiceProvider extends LaravelEventServiceProvider
|
|
{
|
|
/** Max lifetime for the event discovery cache */
|
|
protected const MAX_CACHE_LIFETIME = '1 day';
|
|
|
|
/**
|
|
* @copydoc \Illuminate\Foundation\Support\Providers\EventServiceProvider::getEvents()
|
|
*/
|
|
public function getEvents()
|
|
{
|
|
$expiration = DateInterval::createFromDateString(static::MAX_CACHE_LIFETIME);
|
|
$events = Cache::remember(static::getCacheKey(), $expiration, fn () => $this->discoveredEvents());
|
|
|
|
return array_merge_recursive(
|
|
$events,
|
|
$this->listens()
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @copydoc \Illuminate\Foundation\Support\Providers\EventServiceProvider::shouldDiscoverEvents()
|
|
*/
|
|
public function shouldDiscoverEvents()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @copydoc \Illuminate\Foundation\Support\Providers\EventServiceProvider::discoverEvents()
|
|
*/
|
|
public function discoverEvents()
|
|
{
|
|
// Adapt classes naming convention
|
|
$discoverEvents = new class () extends DiscoverEvents {
|
|
/**
|
|
* @copydoc \Illuminate\Foundation\Events\DiscoverEvents::classFromFile()
|
|
*/
|
|
protected static function classFromFile(SplFileInfo $file, $basePath): string
|
|
{
|
|
return Core::classFromFile($file);
|
|
}
|
|
};
|
|
|
|
return collect($this->discoverEventsWithin())
|
|
->reject(function ($directory) {
|
|
return !is_dir($directory);
|
|
})
|
|
->reduce(function ($discovered, $directory) use ($discoverEvents) {
|
|
return array_merge_recursive(
|
|
$discovered,
|
|
$discoverEvents::within($directory, base_path())
|
|
);
|
|
}, []);
|
|
}
|
|
|
|
/**
|
|
* @copydoc \Illuminate\Foundation\Support\Providers\EventServiceProvider::discoverEventsWithin()
|
|
*/
|
|
protected function discoverEventsWithin()
|
|
{
|
|
return [
|
|
$this->app->basePath('lib/pkp/classes/observers/listeners'),
|
|
$this->app->basePath('classes/observers/listeners'),
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Clears the event cache
|
|
*/
|
|
public static function clearCache(): void
|
|
{
|
|
Cache::forget(static::getCacheKey());
|
|
}
|
|
|
|
/**
|
|
* Retrieves a unique and static key to store the event cache
|
|
*/
|
|
private static function getCacheKey(): string
|
|
{
|
|
return __METHOD__ . static::MAX_CACHE_LIFETIME;
|
|
}
|
|
}
|