mirror of
https://github.com/flarum/framework.git
synced 2025-03-21 20:45:14 +08:00
feat: split frontend asset generation into separate steps for more extensibility (#3446)
This commit is contained in:
parent
79e0f44324
commit
1d949a3170
@ -18,7 +18,14 @@ use Psr\Http\Message\ServerRequestInterface as Request;
|
||||
|
||||
class Assets
|
||||
{
|
||||
/**
|
||||
* @var Container
|
||||
*/
|
||||
protected $container;
|
||||
|
||||
/**
|
||||
* @var Config
|
||||
*/
|
||||
protected $config;
|
||||
|
||||
/**
|
||||
@ -32,26 +39,56 @@ class Assets
|
||||
$this->config = $config;
|
||||
}
|
||||
|
||||
public function forFrontend(string $name)
|
||||
/**
|
||||
* Sets the frontend to generate assets for.
|
||||
*
|
||||
* @param string $name frontend name
|
||||
* @return $this
|
||||
* @throws \Illuminate\Contracts\Container\BindingResolutionException
|
||||
*/
|
||||
public function forFrontend(string $name): Assets
|
||||
{
|
||||
$this->assets = $this->container->make('flarum.assets.'.$name);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function __invoke(Document $document, Request $request)
|
||||
public function __invoke(Document $document, Request $request): void
|
||||
{
|
||||
$locale = $request->getAttribute('locale');
|
||||
|
||||
$compilers = [
|
||||
'js' => [$this->assets->makeJs(), $this->assets->makeLocaleJs($locale)],
|
||||
'css' => [$this->assets->makeCss(), $this->assets->makeLocaleCss($locale)]
|
||||
];
|
||||
$compilers = $this->assembleCompilers($locale);
|
||||
|
||||
if ($this->config->inDebugMode()) {
|
||||
$this->forceCommit(Arr::flatten($compilers));
|
||||
}
|
||||
|
||||
$this->addAssetsToDocument($document, $compilers);
|
||||
}
|
||||
|
||||
/**
|
||||
* Assembles JS and CSS compilers to be used to generate frontend assets.
|
||||
*
|
||||
* @param string|null $locale
|
||||
* @return array[]
|
||||
*/
|
||||
protected function assembleCompilers(?string $locale): array
|
||||
{
|
||||
return [
|
||||
'js' => [$this->assets->makeJs(), $this->assets->makeLocaleJs($locale)],
|
||||
'css' => [$this->assets->makeCss(), $this->assets->makeLocaleCss($locale)]
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds URLs of frontend JS and CSS to the {@link Document} class.
|
||||
*
|
||||
* @param Document $document
|
||||
* @param array $compilers
|
||||
* @return void
|
||||
*/
|
||||
protected function addAssetsToDocument(Document $document, array $compilers): void
|
||||
{
|
||||
$document->js = array_merge($document->js, $this->getUrls($compilers['js']));
|
||||
$document->css = array_merge($document->css, $this->getUrls($compilers['css']));
|
||||
}
|
||||
@ -61,7 +98,7 @@ class Assets
|
||||
*
|
||||
* @param array $compilers
|
||||
*/
|
||||
private function forceCommit(array $compilers)
|
||||
protected function forceCommit(array $compilers): void
|
||||
{
|
||||
/** @var CompilerInterface $compiler */
|
||||
foreach ($compilers as $compiler) {
|
||||
@ -70,10 +107,12 @@ class Assets
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps provided {@link CompilerInterface}s to their URLs.
|
||||
*
|
||||
* @param CompilerInterface[] $compilers
|
||||
* @return string[]
|
||||
*/
|
||||
private function getUrls(array $compilers)
|
||||
protected function getUrls(array $compilers): array
|
||||
{
|
||||
return array_filter(array_map(function (CompilerInterface $compiler) {
|
||||
return $compiler->getUrl();
|
||||
|
Loading…
x
Reference in New Issue
Block a user