OK、まず免責事項。私は最初の Sf2 プロジェクトに取り組んでおり、既存の sf1 プロジェクトに取り組んでおり、それを Sf2 にリファクタリングして、すべての引き出しがどこに移動されたかを理解しています。
今、奇妙なことが起こっていて、最後の髪の毛を引き裂いています.
--- TL;DR: 要約 ---
小枝テンプレートからコントローラーをレンダリングし、そのサブコントローラーに配列を渡しています。配列値の 1 つがオブジェクトですが、そのオブジェクトはコントローラーに到達する前に消えています。
できる限り Symfony2 フローを追跡しましたが、追跡できる限り、オブジェクトは無傷です。その後、迷子になりますが、Symfony\Component\HttpKernel\Fragment\InlineFragmentRenderer::render() と私の (サブ) コントローラーの間のどこかでオブジェクトが消えます。
これは機能ですか、バグですか、それとも私が夢中になっているだけですか?
- - 詳細に - -
imageItemやlinkedPageItemなどのリンクされたエンティティを含むエンティティオブジェクト(小枝変数「コレクション」に割り当てられた)を扱う小枝テンプレートがあります。
私のエンティティは、ArrayAccess を実装する基本クラスを拡張するように設定されているため、オブジェクトがハイドレートされているかどうかに関係なく、配列表記を使用して値にアクセスできます。(ここで概説されているオプション #1 の方法論に従います: http://docs.doctrine-project.org/en/latest/cookbook/implementing-arrayaccess-for-domain-objects.html )。
小枝には、いくつかのオブジェクトをサブコントローラーに渡して画像ブロックをレンダリングする、このような行があります。renderImage サブコントローラーは、独自の小枝ブロックをレンダリングする前に、すべてのクリーンアップを管理します。
メインの小枝ファイルのコードは次のとおりです。
{# blockLinks.html.twig #}
...
{{- render(controller(
'MyBundle:Helper:renderImage',
{
'image': collection['imageItem'],
'options': {
'html_options': { 'class': 'foo' },
'link_options': { 'class': 'bar' },
'link_url': collection['item_link_url'],
'link_page': collection['linkedPageItem']
}
}
)) -}}
...
ただし、renderImage サブコントローラーは $options['link_page'] の値を受け取ることはありません。
これは奇妙だったので、さらに詳しく調べました。小枝がblockLinks.html.twigをレンダリングするPHPファイルを見つけて、それを掘り下げました。
そこには次のものがあります。
// /app/cache/dev/twig/01/30/lotsofnumbers.php
...
echo $this->env->getExtension('http_kernel')->renderFragment($this->env->getExtension('http_kernel')->controller(
"CaponicaFdsWebsiteBundle:Helper:renderImage",
array(
"image" => $this->getAttribute($_collection_, "imageItem", array(), "array"),
"options" => array(
"html_options" => array("class" => "foo"),
"link_options" => array("class" => "bar"),
"link_url" => $this->getAttribute($_collection_, "item_link_url", array(), "array"),
"link_page" => $this->getAttribute($_collection_, "linkedPageItem", array(), "array")
)
)
));
...
OK、問題ないようです。
何が起こっているのかを把握するために行ったところ\Doctrine\Common\Util\Debug::dump($this->getAttribute($_collection_, "linkedPageItem", array(), "array"));
、これが実際に Page オブジェクトを返すことが報告されています。
つまり、次のように報告されます。
object(stdClass)[874]
public '__CLASS__' => string 'MyBundle\Entity\Page'
...
キャッシュ内のコンパイル済み twig php ファイルから開始
-> Symfony\Bridge\Twig\Extension\HttpKernelExtension::renderFragment()
-> Symfony\Component\HttpKernel\Fragment\FragmentHandler::render()
-> Symfony\Component\HttpKernel\Fragment \InlineFragmentRenderer::render()
この時点で、オブジェクトはまだ無傷です ($this->kernel->handle($subRequest, HttpKernelInterface::SUB_REQUEST, false); の呼び出しの直前に $subRequest->attributes->get('options') をダンプすることで確認できます); InlineFragmentRenderer の 62 行目)
次にどこに行くのかわかりません。[\vendor\symfony\symfony\src]Symfony\Bundle\FrameworkBundle\HttpKernel に移動したと思っていましたが、そこでのアクティビティを追跡できないようです。
ただし、renderImageコントローラーを調べて、次のようにオプションをダンプすると:
// MyBundle\Controller\HelperController.php
public function renderImageAction($image, $options = array()) {
print_r(\Doctrine\Common\Util\Debug::dump($options)); // I'm sure there's a 1337 way to use the logger/toolbar for this, I'll figure that out some other day
...
}
私はこれを得る:
array (size=2)
'html_options' =>
array (size=1)
'class' => string 'foo' (length=3)
'link_options' =>
array (size=1)
'class' => string 'bar' (length=3)
つまり、'link_page' オブジェクトはオプションから削除されました - 何か空腹の (そして非常に恐ろしい) ものが Symfony の奥深くに潜んでいて、私のオブジェクトを食べているようです!
これは機能ですか?(配列内のオブジェクトをサブリクエストに渡すことはできません...おそらく、超厳格な MVC の神々を怒らせますか?)
それともバグですか? (何かが食べてはいけないものを食べている?)
それとも、この特定のスティックの完全に間違った端を持っているのでしょうか?
最後の髪の毛を失う前に、誰かが助けてくれることを願っています...
C