We use Laravel 5.2 framework in a LAMP environment with nginx as a balancing front and memcached as HTML cache storage.
We have almost standard caching procedure when cache miss invokes controller action, than middleware puts rendered result in a cache storage and returns response.
Until now we've used responsive markup and one and the same view for mobile and desktop pages.
Now due to some reasons we have to return mobile or desktop HTML page version depending on request headers but both of them still hosted at one and the same URL and use one and the same dataset.
Very simple and fast decision was to separate memcached instances and render two views simultaneously in the same controller action, returning views array, than iterate through array in a caching middleware to store mobile or desktop versions in a relevante memcached instance.
It looks something like this:
Controller action returns views array:
...
return [
ViewType::MOBILE => view('mobile.newsPage', $params),
ViewType::DESKTOP => view('news.newsPage', $params)
];
Middleware caching method distributes result to cache storage instances:
...
foreach ($response->original as $viewType => $view) {
...
$html = $view->render();
$viewTypesStores[$viewType]->put($key, $html, $cachingTime);
...
}
There are some doubts if we do violate Laravel MVC pattern or another Laravel idiom or SOLID principles, changing Controller Action type from view to array, returning different page types at one and the same URL and if there are some better way to render several views based on one dataset avoiding DB double querying.