6

symfony2 でルート ディレクトリを取得しようとしています。

私が使用する場合:

$this->get('kernel')->getRootDir();

次のエラーが表示されます。

FatalErrorException: Error: Call to undefined method Test\Component\ClassLoader\DebugClassLoader::get() 

どうすればこれを修正できますか?

4

3 に答える 3

20

編集、この投稿が非常に多くの注目を集めており、私の投稿が一番上にあることを見て、ルート ディレクトリを取得する最善の方法は、コンストラクターの引数としてクラスに渡すことです。services.ymlこれを行うには、引数で次のように使用します。

serviceName:
  class: Name\Of\Your\Service
  arguments: %kernel.root_dir%

次に、次のコードでは、フレームワークがインスタンス化するときにルート ディレクトリが指定されます。

namespace Name\Of\Your;

class Service
{
    public function __construct($rootDir)
    {
        // $rootDir is the root directory passed in for you
    }
}

以下の残りの回答は、依存性注入を使用せずにそれを行う古くて貧弱な方法です。


これがService Locatorであり、アンチパターンであることを皆さんに認識してもらいたいのです。すべての開発者は、クラスまたはコントローラーが機能するために必要なものをメソッド シグネチャのみから確認できる必要があります。「コンテナ」全体を注入することは非常に一般的であり、デバッグが難しく、最善の方法ではありません。アプリケーションのどこにでも必要なものを具体的に注入できる依存性注入コンテナーを使用する必要があります。具体的に。Aurynと呼ばれる、非常に優れた再帰的にインスタンス化する依存性注入コンテナーを確認してください。. フレームワークがコントローラー/アクションを解決する場所に配置し、コンテナーを使用してコントローラーを作成し、代わりにメソッドを実行します。ブーム!インスタント SOLID コード。

おっしゃるとおり、サービス コンテナには を使用してアクセスし$this->get('service')ます。

ただし、 を使用する$this->get()には、メソッドにアクセスする必要がありますget()

コントローラ アクセス

コントローラーが Symfony が使用する基本コントローラー クラスを拡張していることを確認することで、これや他の多くの便利なメソッドにアクセスできます。

正しいコントローラー基本クラスを参照していることを確認してください。

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class HelloController extends Controller
{
    /** The Kernel should now be accessible via the container **/
    $root = $this->get('kernel')->getRootDir();
}

サービス アクセス

サービスからコンテナーにアクセスする場合は、コントローラーをサービスとして定義する必要があります。詳細については、この投稿この投稿、およびこの投稿を参照してください。別の便利なリンク。いずれにせよ、何を探すべきかがわかりました。この投稿も役立つ場合があります。

use Symfony\Component\DependencyInjection\ContainerInterface; 

class MyClass
{
    private $container;

    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }

    public function doWhatever()
    {
        /** Your container is now in $this->container **/
        $root = $this->container->get('kernel')->getRootDir();
    }
}

config.yml で、新しいタイプを定義します。

myclass:
  class: ...\MyClass
  arguments: ["@service_container"]

ドキュメントでサービス コンテナの詳細を読むことができます。

于 2013-06-24T11:27:16.047 に答える
11

パラメータkernel.root_dirはディレクトリを指しますapp。通常、ルート ディレクトリに移動するには、/ kernel.root_dir.. / を使用します。

したがって、コントローラーで使用できます$this->container->getParameter('kernel.root_dir')."/../"

サービス定義では、次を使用できます。

my_service:
    class: \Path\to\class
    arguments: [%kernel.root_dir%/../]
于 2015-02-22T11:10:28.053 に答える