- vite.shared.js als gemeinsame Quelle fuer Ports, Hot-Files, HMR-Hosts und CORS-Origins der beiden Vite-Builds (Portal/Web) - App\Support\DomainAssetContext kapselt die Vite-Build-Directory- Konfiguration pro Domain (ThemeServiceProvider + Auth-Layout nutzen ihn) - Tailwind-Portal-Content-Globs auf die tatsaechliche View-Struktur gezogen - Dev-Beispiel-Routen + Tests (DomainAssetContextTest, DevExampleRoutesTest) - Aufraeumen: versehentliche Leerdatei dev:web entfernt Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
89 lines
2.8 KiB
PHP
89 lines
2.8 KiB
PHP
<?php
|
|
|
|
namespace App\Providers;
|
|
|
|
use App\Support\DomainAssetContext;
|
|
use Illuminate\Routing\UrlGenerator;
|
|
use Illuminate\Support\Facades\Request;
|
|
use Illuminate\Support\Facades\URL;
|
|
use Illuminate\Support\Facades\View;
|
|
use Illuminate\Support\Facades\Vite;
|
|
use Illuminate\Support\ServiceProvider;
|
|
|
|
class ThemeServiceProvider extends ServiceProvider
|
|
{
|
|
/**
|
|
* Register services.
|
|
*/
|
|
public function register(): void
|
|
{
|
|
$this->mergeConfigFrom(
|
|
base_path('config/domains.php'),
|
|
'domains'
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Bootstrap services.
|
|
*/
|
|
public function boot(): void
|
|
{
|
|
$host = Request::getHost();
|
|
$themeOverride = Request::get('theme');
|
|
|
|
$defaults = [
|
|
'name' => config('app.name'),
|
|
'theme' => 'b2in',
|
|
'view_prefix' => 'b2in',
|
|
'assets_dir' => 'build/b2in',
|
|
'url' => config('app.url'),
|
|
'domain_name' => config('app.domain_name'),
|
|
];
|
|
|
|
$domainConfig = DomainAssetContext::resolve(
|
|
$host,
|
|
$defaults,
|
|
config('domains.domains', []),
|
|
is_string($themeOverride) ? $themeOverride : null,
|
|
);
|
|
|
|
$staticAssetOrigin = DomainAssetContext::staticAssetOrigin($domainConfig);
|
|
$viteDevServerUrl = DomainAssetContext::viteDevServerUrl($domainConfig);
|
|
|
|
config([
|
|
'app.theme' => $domainConfig['theme'],
|
|
'app.view_prefix' => $domainConfig['view_prefix'],
|
|
'app.domain_name' => $domainConfig['domain_name'],
|
|
'app.url' => $domainConfig['url'],
|
|
'app.asset_url' => $staticAssetOrigin,
|
|
]);
|
|
|
|
URL::forceRootUrl($domainConfig['url']);
|
|
URL::forceScheme(parse_url($domainConfig['url'], PHP_URL_SCHEME) ?: 'https');
|
|
|
|
/** @var UrlGenerator $urlGenerator */
|
|
$urlGenerator = app('url');
|
|
$urlGenerator->useAssetOrigin($staticAssetOrigin);
|
|
|
|
View::share('theme', $domainConfig['theme']);
|
|
View::share('viewPrefix', $domainConfig['view_prefix']);
|
|
View::share('domainName', $domainConfig['domain_name']);
|
|
View::share('domainConfig', $domainConfig);
|
|
View::share('domainUrl', $domainConfig['url']);
|
|
View::share('assetUrl', $staticAssetOrigin);
|
|
View::share('viteDevServerUrl', $viteDevServerUrl);
|
|
|
|
if (! app()->runningInConsole()) {
|
|
if (isset($domainConfig['assets_dir'])) {
|
|
DomainAssetContext::configureVite($domainConfig);
|
|
}
|
|
|
|
if (app()->environment('local')) {
|
|
config(['app.vite_dev_server_url' => $viteDevServerUrl]);
|
|
} else {
|
|
Vite::useScriptTagAttributes(['crossorigin' => false]);
|
|
Vite::useStyleTagAttributes(['crossorigin' => false]);
|
|
}
|
|
}
|
|
}
|
|
}
|