6

免責事項: 私はゆっくりと Symfony を使い始めていますが、アーキテクチャがどのように機能するかを理解するのにまだ問題があります。

現在、ルートごとに異なる出力を提供するさまざまバンドル (サービスですよね?) をセットアップしています。ここまでで、Assetics と Twig ブロックを介してスタイルシートとスクリプトをロードする単純な Twig テンプレートを追加することができました。ここで、リモートの場所から Buzz を介してデータを照会する別のバンドルを追加しました。これは、スタンドアロン スクリプトとしては正常に機能しましたが、Twig テンプレートで出力を印刷することはできません。

元のスクリプトのアーキテクチャは次のようなものです (名前はより一般的にされています)。

  • Vendors -abstractすべてのリモート リクエスト バンドルのベースとして機能するクラス。
  • ServiceABC - ABCサービスのエラー処理と出力準備をabstract拡張および定義するクラス。Vendors
  • ClientXYZ -finalを拡張Service_ABCし、返されたデータの出力解析と正規化を定義するクラス。

このバンドルはservices.ymlファイルを取得しました:

# ~/MyApp/Bundle/ServiceABCBundle/Resources/config/services.yml
parameters:
    service_abc_manager.class: MyApp\Bundle\ServiceABCBundle\Models\Service_ABC
    location_manager.class: MyApp\Bundle\ServiceABCBundle\Models\Clients\ClientLocation
    monitor_manager.class: MyApp\Bundle\ServiceABCBundle\Models\Clients\ClientMonitor

services:
    service_abc_manager:
        abstract: true
    location_manager:
        class: %location_manager.class%
        parent: service_abc_manager
    monitor_manager:
        class: %monitor_manager.class%
        parent: service_abc_manager

参照しやすいように名前を変更しました - 偶然のタイプミスの可能性があります。

今、私の問題/質問は、テンプレートに出力を取得する方法の Symfony2 の概念を実際に理解していないことです。

namespace MyApp\Bundle\ServiceABCBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use MyApp\Bundle\ServiceABCBundle\Models\Clients\ClientLocation;

class DefaultController extends Controller
{
    public function indexAction()
    {
        $services = array();
        $services[] = $this->container->has('service_abc_manager');
        $services[] = $this->container->has('location_manager');
        $services[] = $this->container->has('client_location');
        $services[] = $this->container->has('ClientLocation');
        var_dump( $services );
        $client = new ClientLocation();
        var_dump( $client );

        $response = $this->render(
            'Service_ABC:Default:index.html.twig'
        );
        # $response->setCharset( 'utf-8' );
        # $response->headers->set( 'Content-Type', 'text/html' );

        return $response;
    }
}

最初のarray()名前の出力$servicesは常にfalseであり$client = new ClientLocation();、クラス名が見つからないという例外がスローされます。

これらのサービス/バンドル(パーツ)/クラスにアクセスするにはどうすればよいですか? そして、出力をテンプレートにどのようにレンダリングしますか?

アップデート

完全なツリー定義を に追加した後Configuration()->getConfigTreeBuilder()、CLI で定義を確認できます。

class Configuration implements ConfigurationInterface
{
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root( 'myapp_service_abc' );
        $rootNode
            ->children()
                ->scalarNode('service_abc_manager')->end()
                ->scalarNode('location_manager')->end()
                ->scalarNode('monitor_manager')->end()
            ->end()
        ;
        return $treeBuilder;
    }
}

CLI コマンドphp app/console config:dump-reference myapp_service_abcを実行すると、次の出力が得られます。

myapp_service_abc:
    service_abc_manager:  ~
    location_manager:     ~
    monitor_manager:      ~

var_dump( $loader );が呼び出されたMyAppServiceABCExtension直後に、構成データがロードされたこともわかります$loader->load( 'services.yml' );

出力は次のとおりです。

object(Symfony\Component\DependencyInjection\Loader\YamlFileLoader)
  protected 'container' => 
    object(Symfony\Component\DependencyInjection\ContainerBuilder)
      private 'definitions' => 
        array
          'service_abc_manager' => 
            object(Symfony\Component\DependencyInjection\Definition)
          'location_manager' => 
            object(Symfony\Component\DependencyInjection\DefinitionDecorator)
              private 'parent' => string 'service_abc_manager'
          // etc.

問題自体は残っています: when I の内部にはまだ戻り値FALSEがあります。私も試してみましたが、同じ結果でした。DefaultController()->indexAction()var_dump( $this->container->has( 'service_abc_manager' );var_dump( $this->container->has( 'location_manager' );var_dump( $this->container->has( 'myapp.service_abc_manager' );

4

1 に答える 1

9

twig ファイルからではなく、コントローラーからサービスを呼び出す必要があります。

コントローラーの役割は次のとおりです。

  • 投稿されたフォームがあった場合、フォームを検証します
  • サービスを呼び出して、ビューに表示するものを取得します
  • 表示するフォームがある場合、フォームを初期化します
  • 通常、レンダリングされた小枝ビューを含む Response を返します

などを使用してサービスを$client = new ClientLocation();呼び出すのではなく、サービス コンテナーを使用して呼び出します。これにより、Symfony2 が提供する依存性注入の全機能を利用できるようになります。

コントローラーは次のようになります。

<?php

namespace MyApp\Bundle\ServiceABCBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{

    public function indexAction()
    {
        $locationService = $this->container->get('location_manager');

        $someStuffs = $locationService->someMethod();

        $response = $this->render(
           'ServiceABCBundle:Default:index.html.twig', array('stuffs' => $someStuffs)
        );

        return $response;
    }

}

stuffs小枝ファイルから、変数を使用できるようになります:

  • {{ stuffs }}変数が端末(文字列、数値...)の場合
  • {{ stuffs.attribute }}変数がオブジェクトまたは配列の場合

あなたのサービスファイルについては、あなたのアーキテクチャが標準の Symfony2 のものとは思えないので、少し混乱しています:

# ~/MyApp/Bundle/ServiceABCBundle/Resources/config/services.yml

services.ymlファイルがディレクトリにないのはなぜsrc/MyApp/SomethingBundle/Resources/config/ですか?

まだ読んでいない場合は、Symfony2 : The Big Picture のドキュメントを参照することをお勧めします。これは、Symfony2 を始めるための最良の方法です。

于 2013-04-29T17:21:47.430 に答える