Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Kernel.php
Go to the documentation of this file.
1 <?php
7 
11 class Kernel
12 {
18  protected $cache;
19 
23  protected $identifier;
24 
28  protected $request;
29 
33  private $fullPageCache;
34 
38  private $serializer;
39 
43  private $context;
44 
48  private $contextFactory;
49 
53  private $httpFactory;
54 
64  public function __construct(
65  \Magento\Framework\App\PageCache\Cache $cache,
66  \Magento\Framework\App\PageCache\Identifier $identifier,
67  \Magento\Framework\App\Request\Http $request,
68  \Magento\Framework\App\Http\Context $context = null,
69  \Magento\Framework\App\Http\ContextFactory $contextFactory = null,
70  \Magento\Framework\App\Response\HttpFactory $httpFactory = null,
71  \Magento\Framework\Serialize\SerializerInterface $serializer = null
72  ) {
73  $this->cache = $cache;
74  $this->identifier = $identifier;
75  $this->request = $request;
76 
77  if ($context) {
78  $this->context = $context;
79  } else {
81  \Magento\Framework\App\Http\Context::class
82  );
83  }
84  if ($contextFactory) {
85  $this->contextFactory = $contextFactory;
86  } else {
87  $this->contextFactory = \Magento\Framework\App\ObjectManager::getInstance()->get(
88  \Magento\Framework\App\Http\ContextFactory::class
89  );
90  }
91  if ($httpFactory) {
92  $this->httpFactory = $httpFactory;
93  } else {
94  $this->httpFactory = \Magento\Framework\App\ObjectManager::getInstance()->get(
95  \Magento\Framework\App\Response\HttpFactory::class
96  );
97  }
98  if ($serializer) {
99  $this->serializer = $serializer;
100  } else {
101  $this->serializer = \Magento\Framework\App\ObjectManager::getInstance()->get(
102  \Magento\Framework\Serialize\SerializerInterface::class
103  );
104  }
105  }
106 
112  public function load()
113  {
114  if ($this->request->isGet() || $this->request->isHead()) {
115  $responseData = $this->getCache()->load($this->identifier->getValue());
116  if (!$responseData) {
117  return false;
118  }
119  $responseData = $this->serializer->unserialize($responseData);
120  if (!$responseData) {
121  return false;
122  }
123 
124  return $this->buildResponse($responseData);
125  }
126  return false;
127  }
128 
135  public function process(\Magento\Framework\App\Response\Http $response)
136  {
137  if (preg_match('/public.*s-maxage=(\d+)/', $response->getHeader('Cache-Control')->getFieldValue(), $matches)) {
138  $maxAge = $matches[1];
139  $response->setNoCacheHeaders();
140  if (($response->getHttpResponseCode() == 200 || $response->getHttpResponseCode() == 404)
141  && ($this->request->isGet() || $this->request->isHead())
142  ) {
143  $tagsHeader = $response->getHeader('X-Magento-Tags');
144  $tags = $tagsHeader ? explode(',', $tagsHeader->getFieldValue()) : [];
145 
146  $response->clearHeader('Set-Cookie');
147  $response->clearHeader('X-Magento-Tags');
148  if (!headers_sent()) {
149  header_remove('Set-Cookie');
150  }
151 
152  $this->getCache()->save(
153  $this->serializer->serialize($this->getPreparedData($response)),
154  $this->identifier->getValue(),
155  $tags,
156  $maxAge
157  );
158  }
159  }
160  }
161 
168  private function getPreparedData(\Magento\Framework\App\Response\Http $response)
169  {
170  return [
171  'content' => $response->getContent(),
172  'status_code' => $response->getStatusCode(),
173  'headers' => $response->getHeaders()->toArray(),
174  'context' => $this->context->toArray()
175  ];
176  }
177 
184  private function buildResponse($responseData)
185  {
186  $context = $this->contextFactory->create(
187  [
188  'data' => $responseData['context']['data'],
189  'default' => $responseData['context']['default']
190  ]
191  );
192 
193  $response = $this->httpFactory->create(
194  [
195  'context' => $context
196  ]
197  );
198  $response->setStatusCode($responseData['status_code']);
199  $response->setContent($responseData['content']);
200  foreach ($responseData['headers'] as $headerKey => $headerValue) {
201  $response->setHeader($headerKey, $headerValue, true);
202  }
203 
204  return $response;
205  }
206 
212  private function getCache()
213  {
214  if (!$this->fullPageCache) {
215  $this->fullPageCache = \Magento\Framework\App\ObjectManager::getInstance()->get(
216  \Magento\PageCache\Model\Cache\Type::class
217  );
218  }
219  return $this->fullPageCache;
220  }
221 }
__construct(\Magento\Framework\App\PageCache\Cache $cache, \Magento\Framework\App\PageCache\Identifier $identifier, \Magento\Framework\App\Request\Http $request, \Magento\Framework\App\Http\Context $context=null, \Magento\Framework\App\Http\ContextFactory $contextFactory=null, \Magento\Framework\App\Response\HttpFactory $httpFactory=null, \Magento\Framework\Serialize\SerializerInterface $serializer=null)
Definition: Kernel.php:64
$response
Definition: 404.php:11
process(\Magento\Framework\App\Response\Http $response)
Definition: Kernel.php:135