0

MySQLデータベースにアクセスする既存のWebアプリケーションがあります。私はこのアプリケーションをSymfonyに移植しています。アプリケーション全体を一度に移植することはできません。つまり、古いアプリケーションと新しいアプリケーションが同じデータベースにアクセスしており、アプリケーションが同時に実行されているため、新しいアプリケーションは古いデータベースを使用する必要があります。既存のSymfonyアプリケーションに簡単なCMS機能を追加するには

古いアプリケーションを移植する必要があり、簡単なCMSの機能を持っていた:

ページツリーを表しテーブルpageがあります。すべてのページにはslugフィールドがあります。 URLパスは、ページノードを識別するパスを表すスラッグからなる。 "/[parent-slug]/[child-slug]"

ページテーブルには、contentフィールドも含まれています。すでに述べたように、CMSの機能は非常にシンプルなので、コンテンツは単にページレイアウト内のページコンテンツとしてレンダリングされます。ページエントリは、ページレイアウト/テンプレートも指定します。

私の問題は、ルーティングの設定方法がわかりません。通常のSymfonyアプリケーションでは、以前のURLパターンを知っていましたが、この場合は動的です。また、ルートはユーザーがいつでも変更できるため、キャッシュできません。私はSymfonyのルーティングを完全に落として、自分で何かを実装する必要があるのだろうかと思います。しかしどうですか?

今、フレームワークVS CMSルーティングの競合について多くのことを教えてくれるSymfony CMFが見つかりました。だからまず、これが正しい方法だと思った。しかし、このチュートリアルでは、PHPRCに基づいて全く新しいアプリケーションを構築することを目指しています。チュートリアルの概念を私のユースケースに引き出すことができませんでした。

+0

質問を編集して明確にしました。ダウンボートが削除されるか、ダウン投票者が説明してくれることを願っています。ここで何が問題なのでしょうか – fishbone

答えて

1

symfonyアプリケーションで複数のURLルールを実行するので、url接頭辞を使用する必要があります。あなたのcmsは接頭辞/ cms/parent-slug/child-slugまたは他のすべてのコントローラで動作する必要があります。それ以外の場合は、動的要求が到着したときにどのコントローラーを意味するのかを区別できません。

KernelControllerListenerを使用して回避策を試すことができます。彼はすべての要求に追いつき、cmsページが要求されているかどうかを確認します。リクエストに基づいて、コントローラとアクションを自分で設定することができます。コンセプト:

"/"を含むルートを1つだけ作成します。他の規則を放棄する。 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 あなたがデータを移行したい場合は、我々は、ほぼすべての私たちのを使用して、あなたは、フィクスチャローダーを使用することができます例。

関連する問題