laravel应用程序主题系统

时间:2019-12-09 18:57:59

标签: php laravel themes laravel-6

我正在为小众游戏服务器的控制面板工作。我想为我的应用程序提供一个基本的主题系统,目标是将主题资产(js / css / images)与视图保持在一起。我不希望资源目录中的视图和公共目录中的资产分开。

记住这一点;这就是我的想法。

主题(视图和资产)的组织方式如下-即默认test = 223456 number = str(test) a = zip(number,number[1:]) #Checks for adjacent equals = map(lambda x: x[0] == x[1], a) print(list(equals)) #OUTPUT: [True, False, False, False, False] print(any(equals)) #OUTPUT: False print(all(equals)) #OUTPUT: True 目录已删除:

enter image description here

新的 config / site.php

views

修改后的 config / views.php

<?php

return [
    'theme' => 'default',
];

新路线 routes / web.php

<?php

return [

    'paths' => [
        resource_path('themes/' . config('site.theme')),
    ],

    ...

新控制器 app / Http / Controllers / ThemeController.php

Route::get('theme/{file?}', 'ThemeController@serve')
    ->where('file', '[a-zA-Z0-9\.\-\/]+');

通过该设置;如果我想包含主题中的资产,例如<?php namespace App\Http\Controllers; use Carbon\Carbon; use Illuminate\Support\Facades\File; class ThemeController extends Controller { /** * @param $file * @return \Symfony\Component\HttpFoundation\BinaryFileResponse */ public function serve($file) { $siteConfig = config('site'); $filePath = resource_path("themes/{$siteConfig['theme']}/{$file}"); if (!file_exists($filePath)) { header("HTTP/1.0 404 Not Found"); exit; } $fileLastModified = Carbon::createFromTimestamp(filemtime($filePath))->format('D, j M Y H:i:s'); $fileEtag = md5_file($filePath); $requestFileEtag = request()->getETags()[0] ?? null; if (!empty($requestFileEtag) && strcmp($fileEtag, $requestFileEtag) === 0) { header("Last-Modified: {$fileLastModified}"); header("Etag: {$fileEtag}"); header("HTTP/1.1 304 Not Modified"); exit; } return response()->file($filePath, [ 'Cache-Control' => 'public, max-age=' . ($siteConfig['themeFilesCacheForMinutes'] * 60), 'Etag' => $fileEtag, 'Last-Modified' => $fileLastModified, 'Content-Type' => $this->guessMimeType($filePath) ]); } /** * @param $filePath * @return false|string */ private function guessMimeType($filePath) { $ext = pathinfo($filePath, PATHINFO_EXTENSION); switch ($ext) { case 'css': return 'text/css; charset=UTF-8'; case 'js': return 'text/javascript; charset=UTF-8'; default: return File::mimeType($filePath); } } } css/sb-admin-2.min.css的主版式中,这就是我要做的:

<head>...</head>

因此,使用这种技术,我可以将视图和资产保持在一起,并使用php通过缓存功能(通过标头+ etag)来为静态资产提供服务。

我已经在本地对其进行了测试,并且可以正常工作,初始加载大约需要900毫秒,而缓存预热后,它将在500毫秒内加载页面。

我的问题;这是一个不好的方法吗?即使用php提供静态文件?有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

如果要将刀片服务器和静态资产打包为单独的可替换主题,只需为每个主题创建一个软件包,然后使用依赖项注入选择所需的主题。在每个主题的ServiceProvider内部,将您的资产发布到公共目录。