浏览代码

refactor the Site resolving system and store the ot_website in Globals

Olivier Massot 4 年之前
父节点
当前提交
5d24bab49c

+ 18 - 18
ot_optimizer/Classes/XClass/Frontend/Middleware/OtSiteResolver.php → ot_core/Classes/Middleware/Frontend/OtSiteResolver.php

@@ -1,14 +1,15 @@
 <?php
 declare(strict_types = 1);
-namespace Opentalent\OtOptimizer\XClass\Frontend\Middleware;
+namespace Opentalent\OtCore\Middleware\Frontend;
 
 use Opentalent\OtCore\Exception\NoSuchWebsiteException;
-use Opentalent\OtOptimizer\Routing\SiteMatcher;
+use Opentalent\OtCore\Website\OtWebsiteRepository;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
 use Psr\Http\Server\RequestHandlerInterface;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Extbase\Object\ObjectManager;
+use TYPO3\CMS\Core\Routing\SiteRouteResult;
 use TYPO3\CMS\Frontend\Controller\ErrorController;
 use TYPO3\CMS\Frontend\Page\PageAccessFailureReasons;
 
@@ -17,17 +18,6 @@ use TYPO3\CMS\Frontend\Page\PageAccessFailureReasons;
  */
 class OtSiteResolver extends \TYPO3\CMS\Frontend\Middleware\SiteResolver
 {
-    private bool $shallFallback;
-
-    public function __construct($matcher = null)
-    {
-        $this->shallFallback = $_COOKIE['optimize'] != 1 && $_SERVER['TYPO3_OPTIMIZE'] != 1;
-
-        if ($this->shallFallback) {
-            parent::__construct($matcher);
-        }
-    }
-
     /**
      * Resolve the site/language information by checking the page ID or the URL.
      *
@@ -37,13 +27,20 @@ class OtSiteResolver extends \TYPO3\CMS\Frontend\Middleware\SiteResolver
      */
     public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
     {
-        if ($this->shallFallback) {
-            return parent::process($request, $handler);
-        }
+        $otWebsiteRepository = GeneralUtility::makeInstance(ObjectManager::class)->get(OtWebsiteRepository::class);
 
-        $matcher = GeneralUtility::makeInstance(ObjectManager::class)->get(SiteMatcher::class);
         try {
-            $routeResult = $matcher->matchRequest($request);
+            $devMode = $_SERVER['TYPO3_CONTEXT'] == "Development";
+
+            $otWebsite = $otWebsiteRepository->matchUriToWebsite($request->getUri(), $devMode);
+            $site = $otWebsiteRepository->generateWebsiteConfiguration($otWebsite);
+            $language = $site->getDefaultLanguage();
+            if ($devMode) {
+                preg_match("/\w+\/(.*)/", $request->getUri()->getPath(), $m);
+                $tail = $m[1] ?? "";
+            } else {
+                $tail = rtrim($request->getUri()->getPath(), '/');
+            }
         } catch (NoSuchWebsiteException $e) {
             return GeneralUtility::makeInstance(ErrorController::class)->pageNotFoundAction(
                 $request,
@@ -52,6 +49,9 @@ class OtSiteResolver extends \TYPO3\CMS\Frontend\Middleware\SiteResolver
             );
         }
 
+        $routeResult = new SiteRouteResult($request->getUri(), $site, $language, $tail);
+
+        $request = $request->withAttribute('ot_website', $otWebsite);
         $request = $request->withAttribute('site', $routeResult->getSite());
         $request = $request->withAttribute('language', $routeResult->getLanguage());
         $request = $request->withAttribute('routing', $routeResult);

+ 5 - 5
ot_core/Classes/Website/OtWebsiteRepository.php

@@ -6,6 +6,7 @@ use Opentalent\OtCore\Exception\InvalidWebsiteConfigurationException;
 use Opentalent\OtCore\Exception\NoSuchRecordException;
 use Opentalent\OtCore\Exception\NoSuchWebsiteException;
 use Opentalent\OtCore\Utility\RouteNormalizer;
+use Psr\Http\Message\UriInterface;
 use Symfony\Component\Yaml\Yaml;
 use TYPO3\CMS\Core\Http\Uri;
 use TYPO3\CMS\Core\Site\Entity\Site;
@@ -338,15 +339,14 @@ class OtWebsiteRepository
     }
 
     /**
-     * @param \Psr\Http\Message\UriInterface $uri
+     * @param UriInterface $uri
      * @param bool $devMode
+     * @param array|null $website
      * @return int
      * @throws NoSuchWebsiteException
      */
-    public function matchUriToPage(\Psr\Http\Message\UriInterface $uri, bool $devMode=false): int
+    public function matchUriToPage(array $otWebsite, UriInterface $uri, bool $devMode=false): int
     {
-        $website = $this->matchUriToWebsite($uri, $devMode);
-
         $tail = $uri->getPath();
         if ($devMode) {
             $tail = preg_replace("/\/?[\w\-]+\/?(.*)/", "/$1", $tail);
@@ -359,7 +359,7 @@ class OtWebsiteRepository
         return $q
             ->select('uid')
             ->from('pages')
-            ->where($q->expr()->eq('ot_website_uid', $website['uid']))
+            ->where($q->expr()->eq('ot_website_uid', $otWebsite['uid']))
             ->andWhere($q->expr()->eq('slug', $q->expr()->literal($tail)))
             ->execute()
             ->fetchColumn(0);

+ 18 - 0
ot_core/Configuration/RequestMiddlewares.php

@@ -0,0 +1,18 @@
+<?php
+
+/**
+ * Register middlewares, which will be triggered at each request
+ */
+return [
+    'frontend' => [
+        'typo3/cms-frontend/site' => [
+            'target' => Opentalent\OtCore\Middleware\Frontend\OtSiteResolver::class,
+            'before' => [
+                'typo3/cms-adminpanel/initiator'
+            ],
+            'after' => [
+                'typo3/cms-adminpanel/sql-logging'
+            ],
+        ],
+    ],
+];

+ 0 - 25
ot_core/Configuration/base_site_conf.yaml

@@ -1,25 +0,0 @@
-errorHandling:
-  -
-    errorCode: '404'
-    errorHandler: PHP
-    errorPhpClassFQCN: Opentalent\OtTemplating\Page\ErrorHandler
-  -
-    errorCode: '403'
-    errorHandler: PHP
-    errorPhpClassFQCN: Opentalent\OtTemplating\Page\ErrorHandler
-flux_content_types: ''
-flux_page_templates: ''
-languages:
-  -
-    title: Fr
-    enabled: true
-    base: /
-    typo3Language: fr
-    locale: fr_FR
-    iso-639-1: fr
-    navigationTitle: Fr
-    hreflang: fr-FR
-    direction: ltr
-    flag: fr
-    languageId: '0'
-routes: {  }

+ 3 - 2
ot_optimizer/Classes/XClass/Frontend/Middleware/OtPageResolver.php → ot_optimizer/Classes/Middleware/Frontend/OtPageResolver.php

@@ -1,7 +1,7 @@
 <?php
 
 
-namespace Opentalent\OtOptimizer\XClass\Frontend\Middleware;
+namespace Opentalent\OtOptimizer\Middleware\Frontend;
 
 
 use Opentalent\OtCore\Website\OtWebsiteRepository;
@@ -40,9 +40,10 @@ class OtPageResolver extends \TYPO3\CMS\Frontend\Middleware\PageResolver
         $otWebsiteRepository = GeneralUtility::makeInstance(ObjectManager::class)->get(OtWebsiteRepository::class);
         $devMode = $_SERVER['TYPO3_CONTEXT'] == "Development";
 
+        $website = $GLOBALS['TYPO3_REQUEST']->getAttribute('ot_website');
         $params = $request->getQueryParams();
-        $pageUid = $otWebsiteRepository->matchUriToPage($request->getUri(), $devMode);
 
+        $pageUid = $otWebsiteRepository->matchUriToPage($website, $request->getUri(), $devMode);
         if (!$pageUid > 0) {
             return GeneralUtility::makeInstance(ErrorController::class)->pageNotFoundAction(
                 $request,

+ 0 - 49
ot_optimizer/Classes/Routing/SiteMatcher.php

@@ -1,49 +0,0 @@
-<?php
-namespace Opentalent\OtOptimizer\Routing;
-
-use Opentalent\OtCore\Website\OtWebsiteRepository;
-use Psr\Http\Message\ServerRequestInterface;
-use TYPO3\CMS\Core\Routing\SiteRouteResult;
-use TYPO3\CMS\Core\Site\SiteFinder;
-use TYPO3\CMS\Core\Utility\GeneralUtility;
-use TYPO3\CMS\Extbase\Object\ObjectManager;
-
-/**
- * Hooks into the frontend request and use the ot_websites table to resolve the site configuration
- * (frontend only)
- *
- * @internal
- */
-class SiteMatcher extends \TYPO3\CMS\Core\Routing\SiteMatcher
-{
-    public function __construct($finder = null)
-    {
-    }
-
-    /**
-     * Override the default Typo3 \TYPO3\CMS\Core\Routing\SiteMatcher
-     *
-     * @param ServerRequestInterface $request
-     * @return \TYPO3\CMS\Core\Routing\RouteResultInterface
-     * @throws \Opentalent\OtCore\Exception\NoSuchWebsiteException
-     */
-    public function matchRequest(ServerRequestInterface $request): \TYPO3\CMS\Core\Routing\RouteResultInterface
-    {
-        $devMode = $_SERVER['TYPO3_CONTEXT'] == "Development";
-
-        $otWebsiteRepository = GeneralUtility::makeInstance(ObjectManager::class)->get(OtWebsiteRepository::class);
-
-        $otWebsite = $otWebsiteRepository->matchUriToWebsite($request->getUri(), $devMode);
-        $site = $otWebsiteRepository->generateWebsiteConfiguration($otWebsite);
-
-        if ($devMode) {
-            preg_match("/\w+\/(.*)/", $request->getUri()->getPath(), $m);
-            $tail = $m[1] ?? "";
-        } else {
-            $tail = rtrim($request->getUri()->getPath(), '/');
-        }
-
-        $language = $site->getDefaultLanguage();
-        return new SiteRouteResult($request->getUri(), $site, $language, $tail);
-    }
-}

+ 1 - 10
ot_optimizer/Configuration/RequestMiddlewares.php

@@ -5,17 +5,8 @@
  */
 return [
     'frontend' => [
-        'typo3/cms-frontend/site' => [
-            'target' => Opentalent\OtOptimizer\XClass\Frontend\Middleware\OtSiteResolver::class,
-            'before' => [
-                'typo3/cms-adminpanel/initiator'
-            ],
-            'after' => [
-                'typo3/cms-adminpanel/sql-logging'
-            ],
-        ],
         'typo3/cms-frontend/page-resolver' => [
-            'target' => Opentalent\OtOptimizer\XClass\Frontend\Middleware\OtPageResolver::class,
+            'target' => Opentalent\OtOptimizer\Middleware\Frontend\OtPageResolver::class,
             'before' => [
                 'typo3/frontendediting/initiator'
             ],