Files
Gnuboard7/app/Providers/BladeServiceProvider.php
T
2026-04-01 10:30:52 +09:00

138 lines
6.6 KiB
PHP

<?php
namespace App\Providers;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\Facades\Vite;
use Illuminate\Support\ServiceProvider;
class BladeServiceProvider extends ServiceProvider
{
/**
* Register services.
*/
public function register(): void
{
//
}
/**
* Bootstrap services.
*/
public function boot(): void
{
Blade::directive('viteThemeAssets', function ($expression) {
return "<?php
\$params = {$expression};
// 매개변수 처리: 배열로 전달된 경우와 단순 배열로 전달된 경우 구분
if (is_array(\$params)) {
// 연관 배열인지 확인 (키가 문자열인지)
\$isAssoc = array_keys(\$params) !== range(0, count(\$params) - 1);
if (\$isAssoc && isset(\$params['entries'])) {
// 연관 배열 형태: ['entries' => [...], 'type' => '...', 'target' => '...', 'theme' => '...']
\$entries = \$params['entries'];
\$type = \$params['type'] ?? 'core';
\$target = \$params['target'] ?? 'admin';
\$themeName = \$params['theme'] ?? theme_name(\$type, \$target);
} else {
// 단순 배열 형태: [entry1, entry2, ...]
\$entries = \$params;
\$type = 'core';
\$target = 'admin';
\$themeName = theme_name(\$type, \$target);
}
} else {
// 단일 값인 경우
\$entries = [\$params];
\$type = 'core';
\$target = 'admin';
\$themeName = theme_name(\$type, \$target);
}
// Vite 개발 서버 실행 여부 확인
\$viteDevServerRunning = false;
\$viteDevServerUrl = config('app.vite_dev_server_url', 'http://localhost:5173');
if (app()->environment('local', 'development')) {
\$context = stream_context_create([
'http' => [
'timeout' => 1,
'ignore_errors' => true
]
]);
\$viteDevServerRunning = @file_get_contents(\$viteDevServerUrl . '/@vite/client', false, \$context) !== false;
}
if (\$viteDevServerRunning) {
// 개발 서버가 실행 중인 경우 - Vite 개발 서버 사용
echo '<script type=\"module\" src=\"' . \$viteDevServerUrl . '/@vite/client\"></script>';
foreach (\$entries as \$entry) {
echo '<script type=\"module\" src=\"' . \$viteDevServerUrl . '/' . \$entry . '\"></script>';
}
} else {
// 프로덕션 또는 개발 서버 미실행 - 빌드된 파일 사용
\$buildPath = resource_path('themes/' . \$type . '/' . \$target . '/' . \$themeName . '/build');
\$manifestPath = \$buildPath . '/manifest.json';
if (file_exists(\$manifestPath) && is_array(\$entries)) {
\$manifest = json_decode(file_get_contents(\$manifestPath), true);
foreach (\$entries as \$entry) {
if (isset(\$manifest[\$entry])) {
\$entryData = \$manifest[\$entry];
// JavaScript 파일 로드
if (isset(\$entryData['file'])) {
\$jsFileName = basename(\$entryData['file']);
\$jsFileName = preg_replace('/^(.+?)-[^.]+\.js$/', '\$1.js', \$jsFileName);
\$routeParams = [
'themeName' => \$themeName,
'path' => \$jsFileName,
'type' => \$type,
'target' => \$target
];
// 모듈명이 있는 경우 추가
\$moduleName = \$params['module_name'] ?? null;
if (\$moduleName) {
\$routeParams['module_name'] = \$moduleName;
}
echo '<script type=\"module\" src=\"' . route('api.public.themes.serve-asset', \$routeParams) . '\"></script>';
}
// CSS 파일 로드
if (isset(\$entryData['css'])) {
foreach (\$entryData['css'] as \$cssFile) {
\$cssFileName = basename(\$cssFile);
\$cssFileName = preg_replace('/^(.+?)-[^.]+\.css$/', '\$1.css', \$cssFileName);
\$routeParams = [
'themeName' => \$themeName,
'path' => \$cssFileName,
'type' => \$type,
'target' => \$target
];
// 모듈명이 있는 경우 추가
\$moduleName = \$params['module_name'] ?? null;
if (\$moduleName) {
\$routeParams['module_name'] = \$moduleName;
}
echo '<link rel=\"stylesheet\" href=\"' . route('api.public.themes.serve-asset', \$routeParams) . '\">';
}
}
}
}
}
}
?>";
});
}
}