“我的View Composer”将一些数据传递到某些视图(当然可以):
use Illuminate\View\View;
use App\Util\Helper
class PublicSettingsComposer
{
public function compose(View $view)
{
$view->with('settings', Helper::readSettingsFromFile()); // json
}
}
适当的提供程序已添加到配置中,并且它为所有特定视图正确提供了此作曲家:
view()->compose('public.layouts.*', 'App\Http\ViewComposers\PublicSettingsComposer');
但是,在(仅)一个视图内部,我需要数据库中的特定信息,但是因此我必须使用一些由View Composer传递的数据:
class BranchController extends Controller
{
public function branches()
{
$settings = retrieve_settings_passed_by_PublicSettingsComposer; // This is what I need
$headquartersId = $settings->headquartersid;
return view('public.layouts.branches', [
'headquarters' => Branch::find($headquartersId) // Branch is a Model
]);
}
}
仅供参考:我使用的Laravel版本是:5.5
P.S。 @主持人:请谨慎考虑我的问题是否重复。我知道有很多关于视图编写器,将数据传递到视图以及从控制器内部获取数据的问题。但是,在这种情况下,我真的找不到任何问题(标题经常会引起误解)。
答案 0 :(得分:1)
我看到了两个非常简单的解决方案。第一个是在每个请求中缓存已解析的文件。另一种是为此作业使用实际的缓存。
第一个选择非常容易实现。在Helper
类中,您必须引入一个静态属性来保存已读取文件的解析内容。然后,就像在单例模式中一样,您要么返回缓存的数据,要么首先解析文件,然后缓存数据并随后返回。这种情况解决了您的实际问题,如果在应用程序的两个位置使用了每个请求,则两次解析设置。
class Helper
{
protected static $cachedSettings;
public function readSettingsFromFile()
{
if (!self::$cachedSettings) {
self::$cachedSettings = // Do the parsing here. This should be your current implementation of Helper::readSettingsFromFile(). You can also put this in its own function.
}
return self::$cachedSettings;
}
}
另一种选择是使用实际的缓存(外部缓存)。您可以将已解析的文件缓存特定的时间(例如1、3、5或10分钟,甚至更长)。或者,您可以永久缓存它,并在更新设置时使缓存无效(如果这在您的应用程序中发生并且您知道已被更新)。
仅当您的设置更改的频率不太高时,此解决方案才有意义。它还取决于您对应用程序的预期请求量。如果您的设置更改不太频繁(少于每 x分钟),并且您的应用频繁使用(每隔 x分钟多次请求),那么这可能是一个可行的解决方案。
class Helper
{
public function readSettingsFromFile()
{
return Cache::remember(function () {
$settings = // Put your current calculation here
return $settings;
}, 3 * 60); // 3 * 60 = 180 seconds
}
}