免責事項: 私はゆっくりと 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' );