0

我有一個現有的Web應用程序訪問MySQL數據庫。我將這個應用程序移植到Symfony。新的應用程序必須使用舊的數據庫,因爲我們無法一次移植整個應用程序,即舊的和新的應用程序正在訪問同一個數據庫,並且應用程序正在同時運行。如何將簡單的CMS功能添加到現有的Symfony應用程序

舊的應用程序有哪些必須要移植一個簡單​​的CMS功能:

有一個表page它代表一個頁面樹。每個頁面都有一個slug字段。 URL路徑由表示標識頁面節點的路徑的那些段落組成,例如"/[parent-slug]/[child-slug]"

該頁面表還包含一個content字段。正如我已經提到的那樣,CMS的功能非常簡單,所以內容只是在頁面佈局內呈現爲頁面內容。頁面條目還指定頁面佈局/模板。

我的問題是,我不知道如何設置路由。在一個正常的Symfony應用程序中,我會知道之前的URL模式,但在這種情況下它們是動態的。此外,路由不能被緩存,因爲用戶可以隨時更改路由。我想知道是否必須完全放棄Symfony的路由並自行實施某些功能。但是如何?

現在我發現了Symfony CMF,它講述了很多關於VS CMS路由衝突的框架。所以首先,我認爲這將是正確的方式。然而,這些教程旨在建立一個基於PHPRC的全新應用程序。我無法將教程的概念推導到我的用例中。

+0

我編輯和澄清了這個問題。希望downvote會被刪除或down down的投票人解釋,這裏有什麼問題 – fishbone

回答

1

由於您在一個symfony應用程序上運行了多個URL規則,因此您需要使用url前綴。您的CMS應該使用前綴/ cms/parent-slug/child-slug或所有其他控制器。否則,當動態請求到達時,您無法區分哪個控制器的含義。

您可以嘗試使用KernelControllerListener的解決方法。他會趕上每一個請求,然後檢查是否請求了一個cms頁面。根據請求,您可以自行設置控制器和操作。概念:

只用「/」創建一條路線。放棄其他規則。然後創建一個這樣的監聽器:

<?php 

namespace AppBundle\Listener; 
use Symfony\Component\HttpKernel\Event\FilterControllerEvent; 

/** 
* Class KernelControllerListener 
* @package ApiBundle\Listener 
*/ 
class KernelControllerListener 
{ 
    /** 
    * @var CmsRepository 
    */ 
    private $requestParser; 

    /** 
    * KernelControllerListener constructor. 
    * @param CmsRepository $CmsRepository 
    */ 
    public function __construct(CmsRepository $CmsRepository) 
    { 
     $this->CmsRepository = $CmsRepository; 
    } 

    /** 
    * @param FilterControllerEvent $event 
    */ 
    public function onKernelController(FilterControllerEvent $event){ 
     $request = $event->getRequest(); 
     //should be /parent-slug/children/slug or any other path 
     $path = $request->getPathInfo(); 

     if($this->CmsRepository->getCmsControllerIfMatch($path)){ 
      //cms repository search in db for page with this path, otherwise return false 
      $event->setController([AppBundle\CmsController::class, 'cmsAction']); 
      return; 
     } 

     //repeat if clause for any other application part 
    } 
} 

在services.yml:

app.controller_listener: 
    class: AppBundle\Listener\KernelControllerListener 
    arguments: 
    - "@app.cms_repository" 
    tags: 
    - { name: kernel.event_listener, event: kernel.controller, method: onKernelController } 

編輯:捕獲所有路線,看到https://www.jverdeyen.be/symfony2/symfony-catch-all-route/

相關問題