我们在LAMP环境中使用Laravel 5.2框架,其中nginx作为平衡前端,而memcached作为HTML缓存存储。
当缓存未命中调用控制器操作时,我们具有几乎标准的缓存过程,而中间件则将呈现的结果放入缓存存储中并返回响应。
直到现在,我们已经对移动和桌面页面使用了响应式标记和一个视图。
现在由于某些原因,我们不得不根据请求标头返回移动或桌面HTML页面版本,但是它们两者仍托管在一个相同的URL并使用一个相同的数据集。
非常简单快捷的决定是分离内存缓存实例,并在同一控制器操作中同时渲染两个视图,返回视图数组,然后在缓存中间件中遍历数组以在相关的内存缓存实例中存储移动或桌面版本。
它看起来像这样:
控制器动作返回views数组:
...
return [
ViewType::MOBILE => view('mobile.newsPage', $params),
ViewType::DESKTOP => view('news.newsPage', $params)
];
中间件缓存方法将结果分发到缓存存储实例:
...
foreach ($response->original as $viewType => $view) {
...
$html = $view->render();
$viewTypesStores[$viewType]->put($key, $html, $cachingTime);
...
}
我们是否确实违反Laravel MVC模式或其他Laravel惯用语或SOLID原则,将Controller Action类型从视图更改为数组,以相同的URL返回不同的页面类型,以及是否存在更好的呈现方式,这令人怀疑基于一个数据集的多个视图,避免数据库重复查询。