0

MySQL 데이터베이스에 액세스하는 기존 웹 응용 프로그램이 있습니다. 이 애플리케이션을 Symfony로 이식하고 있습니다. 새 응용 프로그램은 이전 응용 프로그램을 모두 한 번에 이식 할 수 없으므로 이전 데이터베이스를 사용해야합니다. 즉, 이전 응용 프로그램과 새 응용 프로그램이 동일한 데이터베이스에 액세스하고 응용 프로그램이 동시에 실행되고 있습니다.기존 Symfony 응용 프로그램에 간단한 CMS 기능을 추가하는 방법

페이지 트리를 나타내는 테이블 page 있습니다 :

이전 응용 프로그램

는 이식 할 수있는 간단한 CMS 기능을 가지고 있었다. 모든 페이지에는 slug 필드가 있습니다. URL 경로는 페이지 노드를 식별하는 경로를 나타내는 슬러그로 구성됩니다 (예 : "/[parent-slug]/[child-slug]".

페이지 테이블에는 content 필드도 있습니다. 이미 언급했듯이 CMS 기능은 매우 간단하므로 콘텐츠는 페이지 레이아웃 내에서 페이지 콘텐츠로 렌더링됩니다. 또한 페이지 항목은 페이지 레이아웃/템플리트를 지정합니다.

내 문제는 라우팅 설정 방법을 모른다는 것입니다. 정상적인 Symfony 어플리케이션에서는 이전에 URL 패턴을 알고 있었지만이 경우에는 동적입니다. 또한 경로는 사용자가 언제든지 변경할 수 있기 때문에 캐시 할 수 없습니다. Symfony의 라우팅을 완전히 삭제하고 스스로 구현해야하는지 궁금합니다. 그러나 어떻게?

이제 프레임 워크 VS CMS 라우팅 충돌에 대해 많이 알리는 Symfony CMF를 발견했습니다. 그래서 처음에는 이것이 올바른 길일 거라 생각했습니다. 그러나 튜토리얼은 PHPRC를 기반으로 완전히 새로운 응용 프로그램을 작성하는 것을 목표로합니다. 튜토리얼의 개념을 나의 유스 케이스로 끌어낼 수 없었다.

+0

내가 편집하여 질문을 명확히했습니다. 다운 vote가 제거되거나 다운 유권자가 설명하기를 바랍니다. – fishbone

답변

1

하나의 심포니 애플리케이션에서 여러 URL 규칙을 실행하기 때문에 URL 접두어로 작업해야합니다. cms는/cms/parent-slug/child-slug 또는 다른 모든 컨트롤러와 함께 작동해야합니다. 그렇지 않으면 동적 요청이 도착할 때 어떤 컨트롤러를 의미하는지를 구분할 수 없습니다.

KernelControllerListener를 사용하여 문제를 해결할 수 있습니다. 그는 모든 요청을 따라 잡고 cms 페이지가 요청되었는지 확인합니다. 요청에 따라 컨트롤러와 작업을 직접 설정할 수 있습니다. 개념 :

"/"가있는 경로를 하나만 만듭니다. 다른 규칙을 포기하십시오. services.yml에서

<?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 
    } 
} 

:

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/

0

질문입니다 : 당신이 데이터를 마이그레이션 할 whant 마십시오 아니. 두 질문 모두에 대해 CMF가 답이 될 수 있습니다. 간단한 동적 라우터를 싶다면, 당신은 사용자 정의 라우터 정의로 ChainRouter에보고해야한다 : 우리가 거의 전부를 사용할 때, 당신은 데이터를 마이그레이션 싶다면 https://symfony.com/doc/current/cmf/bundles/routing/dynamic.htmlhttps://symfony.com/doc/current/cmf/components/routing/chain.html , 당신은 고정 로더를 사용하여 우리의 예.