2016-02-16 9 views
10

私はコアWebサイト、APIおよび管理領域を持つアプリケーションを持っています。私は1つのアプリケーションにすべてを持つことは悪い考えか、別のSymfony2プロジェクトを作成すべきか、別のカーネルに分割すべきかどうかを知りたかったのですか?Symfony2複数のカーネル?

私は同じカーネル上のバンドルの多くを追加すると、パフォーマンスに多くの影響を与えるかは重要ではありませんほんの少し、であるかどうか分かりませんか?

optionsには、以下の

  1. が同じカーネル上のすべてを保つには、それは文句を言わない
  2. は、異なるアプリケーションの一部(API、管理者およびコアWebサイト)
  3. 異なるSymfony2のを作成するために複数のカーネルを持っている大きな違いを作ります管理領域とAPIのプロジェクト。
  4. またはあなたの賢明な言葉:)
+1

あなたはこの 'の場合(in_arrayを行うため、このフォローのDEVのexempleを行うためのエンバイロメントを作成して試すことができます(の$ this - > GetEnvironment関数()、 array( 'dev'、 'test'))){'in appKernel – pietro

+0

あなたは私の前のコメントについてどう思いましたか? – pietro

+0

あなたの忘れた1つのオプション:複数のバンドルの分割コードについては、すでにここで議論されていました:[Symfony 2.xでは本当にすべてバンドルするべきですか?](http://stackoverflow.com/q/9999433/2257664)または[Symfony2概念上の問題:一般バンドルと特定のバンドル](http://stackoverflow.com/q/8012191/2257664) –

答えて

2

さらに「環境」を定義することができます。例えば

でAppKernel.php

public function registerBundles() 
    { 
     $bundles = array(
      new Symfony\Bundle\FrameworkBundle\FrameworkBundle(), 
      new Symfony\Bundle\SecurityBundle\SecurityBundle(), 
      new Symfony\Bundle\TwigBundle\TwigBundle(), 
      new Symfony\Bundle\MonologBundle\MonologBundle(), 
      new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(), 
      new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(), 
      new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(), 
      //new AppBundle\AppBundle() 
     ); 

     if (in_array($this->getEnvironment(), array('api'), true)) { 
      $bundles[] = new ApiBundle\ApiBundle(); 
      //-- Other bundle 
     } 
     //-- Other environments 


     return $bundles; 
    } 
} 
+0

私はこれが正しいとは思いません。 APIバンドルは、PRODUCTION/DEVELOPMENT環境の両方にロードされ、異なる動作を提供する可能性があります。したがって、たとえば、ENVはCore App、Apiアプリケーション領域のモードです。また、STAGING、TESTING環境を持つこともできます。 – lexeme

0

それは個人的な選択だが、私は同様のプロジェクトを持っていると私はすべて同じプロジェクト内publicBundle、adminBundleとapiBundleを持っています。

余分なパフォーマンスヒットがnegliableですが、組織が鍵です...我々は最初の場所でMVCパッケージ(symfonyの)を使用している理由です、それはないですか? :)

注意:用語は少し混乱している、私はKernelあなたはBundleを意味すると思います。

+0

いいえ、カーネルは私がカーネルを意味しています...私はすべてのバンドルを持っています。すべてのバンドルがメインのWebサイトで実行されているわけではないので、 – Basit

+0

複数のバンドル(ここではカップルについてのみ話しています)は実際にはパフォーマンスに影響しません。すべてが同じドメイン、同じブランディング、同じURLの場合は、1つのカーネルを使用します。 – Egg

+0

カップルが必要ないバンドルは、バンドル数が10以上のバンドルに近いので、本当に素晴らしいものやイベントハンドリングをしてください。sonataAdminBundle like – Basit

2

これは、主にバンドルの質に依存します。そして、どれだけ彼らが結びついているのか。

私は開始(create different Symfony2 project for admin area and api.)でポイント3を拒絶するでしょう - おそらくとして次の2つの別々のアプリケーションを構築していません。

は、異なるアプリケーションの一部(API、管理者およびコアWebサイト)のために複数のカーネル

共通の問題は、容器内のリスナーやサービスによって作成さを持っています。特に、リスナーがアプリケーションコンテキスト(api/frontend/backend)のいずれかでのみ動作する必要がある場合。たとえあなたが聴取者メソッドの冒頭でそれをチェックすることを覚えていても(そして欲しい文脈でしか魔法をやっていない)、依然として聞き手は、構築され注入される必要のある注入サービスに依存することができます。ここでの良い例はFOS/RestBundleです:zonesをまだフロントエンドに設定していても(view_listenerがapiのためにアクティブ化されている場合)view_handlerは初期化され、リスナーに注入されます - https://github.com/FriendsOfSymfony/FOSRestBundle/blob/master/Resources/config/view_response_listener.xml#L11私はここ100%は確かではありませんが、等)API(ほとんどのAPIのそれを必要としない)の速度を上げるでしょう。

APIコンテキスト用に別のカーネルを作成すると、この問題が解決されます(このプロジェクトでは、カーネルを1つ使用し、そのリスナーを無効にしなければなりませんでした.- blackfire.ioプロファイルはすべての要求に対して〜15msを保存しています)。 APIのための新しいカーネルを作成する

は確かAPIのみのサービス/リスナーはフロントエンド/バックエンドのレンダリングに干渉しないのどれもが(それは両方の方法を動作する)ことになるだろう。しかし、プロジェクト内の多くのバンドル(異なるカーネルのバンドル)で共有されているcomponentsを作成する追加作業を作成しますが、作曲家の世界ではもはや大きな仕事ではありません。

しかし、それだけで、応答時間のミリ秒毎に測定する人のためのケースです。 /あなたの/ 3dpartyバンドルの品質に依存します。すべてが完全にokなら、カーネルを混乱させる必要はありません。

0

いくつかのカーネルが必ずしも役立つとは限りません。

アプリケーションをバンドルで分割し、エンティティをアプリケーションのさまざまな部分で共有するなどのメリットをすべて忘れないでください。

ホスト/ URLに応じてロードされる分離したルーティング/コントローラ/設定を定義できます。

注:

あなたが同じエンティティ二つの大きなバンドル(すなわち、管理& API)、 にと2シェアというあなたのアプリを分離しようとしている場合、あなたは確かに選択を行う必要があります。

この選択肢には、バンドルの1つにあまりに多くの(関連していない)ロジックが含まれている可能性があり、後で複数のバンドルでリファクタリングする必要があります。

関連リソースのセットに対応するアプリケーションのセクションごとにバンドルを作成し、構成とは異なるコンテキストで2つの部分を変更します。

また、クラス/ネームスペースの名前を分かりやすくしてください。

+0

私は複数のバンドルを持っていますが、バンドルでは違うものを作成しても、私が求めていたことは本当に助けになりません。私はパフォーマンスについて尋ねていましたが、たとえあなたが違うバンドルに物事を持っていても、それはパスが呼ばれるまでそれを必要としません。 – Basit

関連する問題