Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Config.php
Go to the documentation of this file.
1 <?php
7 
12 use Magento\PageCache\Model\Varnish\VclGeneratorFactory;
13 
21 class Config
22 {
26  const BUILT_IN = 1;
27 
28  const VARNISH = 2;
29 
33  const XML_PAGECACHE_TTL = 'system/full_page_cache/ttl';
34 
35  const XML_PAGECACHE_TYPE = 'system/full_page_cache/caching_application';
36 
37  const XML_VARNISH_PAGECACHE_ACCESS_LIST = 'system/full_page_cache/varnish/access_list';
38 
39  const XML_VARNISH_PAGECACHE_BACKEND_PORT = 'system/full_page_cache/varnish/backend_port';
40 
41  const XML_VARNISH_PAGECACHE_BACKEND_HOST = 'system/full_page_cache/varnish/backend_host';
42 
43  const XML_VARNISH_PAGECACHE_GRACE_PERIOD = 'system/full_page_cache/varnish/grace_period';
44 
45  const XML_VARNISH_PAGECACHE_DESIGN_THEME_REGEX = 'design/theme/ua_regexp';
46 
50  protected $_scopeConfig;
51 
55  const VARNISH_5_CONFIGURATION_PATH = 'system/full_page_cache/varnish5/path';
56 
60  const VARNISH_4_CONFIGURATION_PATH = 'system/full_page_cache/varnish4/path';
61 
65  protected $_cacheState;
66 
70  protected $readFactory;
71 
75  protected $reader;
76 
80  private $serializer;
81 
85  private $vclGeneratorFactory;
86 
95  public function __construct(
96  \Magento\Framework\Filesystem\Directory\ReadFactory $readFactory,
97  \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
98  \Magento\Framework\App\Cache\StateInterface $cacheState,
99  \Magento\Framework\Module\Dir\Reader $reader,
100  VclGeneratorFactory $vclGeneratorFactory,
101  Json $serializer = null
102  ) {
103  $this->readFactory = $readFactory;
104  $this->_scopeConfig = $scopeConfig;
105  $this->_cacheState = $cacheState;
106  $this->reader = $reader;
107  $this->serializer = $serializer ?: ObjectManager::getInstance()->get(Json::class);
108  $this->vclGeneratorFactory = $vclGeneratorFactory;
109  }
110 
117  public function getType()
118  {
119  return $this->_scopeConfig->getValue(self::XML_PAGECACHE_TYPE);
120  }
121 
128  public function getTtl()
129  {
130  return $this->_scopeConfig->getValue(self::XML_PAGECACHE_TTL);
131  }
132 
141  public function getVclFile($vclTemplatePath)
142  {
143  $accessList = $this->_scopeConfig->getValue(self::XML_VARNISH_PAGECACHE_ACCESS_LIST);
144  $designExceptions = $this->_scopeConfig->getValue(
145  self::XML_VARNISH_PAGECACHE_DESIGN_THEME_REGEX,
146  \Magento\Store\Model\ScopeInterface::SCOPE_STORE
147  );
148 
149  $version = $vclTemplatePath === self::VARNISH_5_CONFIGURATION_PATH ? 5 : 4;
150  $sslOffloadedHeader = $this->_scopeConfig->getValue(
151  \Magento\Framework\HTTP\PhpEnvironment\Request::XML_PATH_OFFLOADER_HEADER
152  );
153  $vclGenerator = $this->vclGeneratorFactory->create([
154  'backendHost' => $this->_scopeConfig->getValue(self::XML_VARNISH_PAGECACHE_BACKEND_HOST),
155  'backendPort' => $this->_scopeConfig->getValue(self::XML_VARNISH_PAGECACHE_BACKEND_PORT),
156  'accessList' => $accessList ? explode(',', $accessList) : [],
157  'designExceptions' => $designExceptions ? $this->serializer->unserialize($designExceptions) : [],
158  'sslOffloadedHeader' => $sslOffloadedHeader,
159  'gracePeriod' => $this->_scopeConfig->getValue(self::XML_VARNISH_PAGECACHE_GRACE_PERIOD)
160  ]);
161  return $vclGenerator->generateVcl($version);
162  }
163 
170  protected function _getReplacements()
171  {
172  return [
173  '/* {{ host }} */' => $this->_scopeConfig->getValue(self::XML_VARNISH_PAGECACHE_BACKEND_HOST),
174  '/* {{ port }} */' => $this->_scopeConfig->getValue(self::XML_VARNISH_PAGECACHE_BACKEND_PORT),
175  '/* {{ ips }} */' => $this->_getAccessList(),
176  '/* {{ design_exceptions_code }} */' => $this->_getDesignExceptions(),
177  // http headers get transformed by php `X-Forwarded-Proto: https`
178  // becomes $SERVER['HTTP_X_FORWARDED_PROTO'] = 'https'
179  // Apache and Nginx drop all headers with underlines by default.
180  '/* {{ ssl_offloaded_header }} */' => str_replace(
181  '_',
182  '-',
183  $this->_scopeConfig->getValue(\Magento\Framework\HTTP\PhpEnvironment\Request::XML_PATH_OFFLOADER_HEADER)
184  ),
185  '/* {{ grace_period }} */' => $this->_scopeConfig->getValue(self::XML_VARNISH_PAGECACHE_GRACE_PERIOD)
186  ];
187  }
188 
200  protected function _getAccessList()
201  {
202  $result = '';
203  $tpl = " \"%s\";";
204  $accessList = $this->_scopeConfig->getValue(self::XML_VARNISH_PAGECACHE_ACCESS_LIST);
205  if (!empty($accessList)) {
206  $result = [];
207  $ips = explode(',', $accessList);
208  foreach ($ips as $ip) {
209  $result[] = sprintf($tpl, trim($ip));
210  }
211  return implode("\n", $result);
212  }
213  return $result;
214  }
215 
225  protected function _getDesignExceptions()
226  {
227  $result = '';
228  $tpl = "%s (req.http.user-agent ~ \"%s\") {\n" . " hash_data(\"%s\");\n" . " }";
229 
230  $expressions = $this->_scopeConfig->getValue(
231  self::XML_VARNISH_PAGECACHE_DESIGN_THEME_REGEX,
232  \Magento\Store\Model\ScopeInterface::SCOPE_STORE
233  );
234  if ($expressions) {
235  $rules = array_values($this->serializer->unserialize($expressions));
236  foreach ($rules as $i => $rule) {
237  if (preg_match('/^[\W]{1}(.*)[\W]{1}(\w+)?$/', $rule['regexp'], $matches)) {
238  if (!empty($matches[2])) {
239  $pattern = sprintf("(?%s)%s", $matches[2], $matches[1]);
240  } else {
241  $pattern = $matches[1];
242  }
243  $if = $i == 0 ? 'if' : ' elsif';
244  $result .= sprintf($tpl, $if, $pattern, $rule['value']);
245  }
246  }
247  }
248  return $result;
249  }
250 
257  public function isEnabled()
258  {
259  return $this->_cacheState->isEnabled(\Magento\PageCache\Model\Cache\Type::TYPE_IDENTIFIER);
260  }
261 }
__construct(\Magento\Framework\Filesystem\Directory\ReadFactory $readFactory, \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, \Magento\Framework\App\Cache\StateInterface $cacheState, \Magento\Framework\Module\Dir\Reader $reader, VclGeneratorFactory $vclGeneratorFactory, Json $serializer=null)
Definition: Config.php:95
$pattern
Definition: website.php:22
$expressions
Definition: side-menu.phtml:10
const XML_VARNISH_PAGECACHE_BACKEND_HOST
Definition: Config.php:41
getVclFile($vclTemplatePath)
Definition: Config.php:141
const XML_VARNISH_PAGECACHE_BACKEND_PORT
Definition: Config.php:39
const XML_VARNISH_PAGECACHE_DESIGN_THEME_REGEX
Definition: Config.php:45
const XML_VARNISH_PAGECACHE_GRACE_PERIOD
Definition: Config.php:43
$i
Definition: gallery.phtml:31