2016-01-13 56 views
5

symfony2からtwigのエンティティにアクセスする必要があります。 のcontrolerの内部では、私は何かを行うことができます:redirectToRoute()メソッドはrender()のような引数を持つことができますか?

return $this->render('frontendBundle::carrodecompras.html.twig', array(
     'entity' => $entity 
)); 

そして小枝で私がentity.nameと、そのようなを持つエンティティのプロパティにアクセスすることができます。

私は同じことを達成するために必要がありますが、機能にredirectToRoute()

return $this->redirectToRoute('frontend_carrodecompras', array(
     'entity' => $entity, 
)); 

しかし、動作するようには思えません。私は次のエラーを取得しています

変数 "実体は" frontendBundleに存在しません::ライン32

EDITでcarrodecompras.html.twig:私はsymfony 2.7

を使用しています

変数$エンティティは、私はこれをテストしただけredirectToRoute関数の前に、(それは実際に私は簡略化のために$エンティティを使用していたアプリの$コルティナと呼ばれる)が存在すること

echo "<pre>"; 
var_dump($cortina); 
echo "</pre>"; 

return $this->redirectToRoute('frontend_carrodecompras', array(
       'cortina' => $cortina, 
       )); 

そして、結果はこれです:

object(dexter\backendBundle\Entity\cortina)#373 (16) { 
    ["id":"dexter\backendBundle\Entity\cortina":private]=> 
    int(3) 
    ... 

これは小枝コードです:あなたは、コントローラからredirectToRoute($route, array $parameters)を呼び出すと

<tr> 
    {% set imagentela = "img/telas/" ~ cortina.codInterno ~ ".jpg" %} 
    <td><img src="{{ asset(imagentela | lower) }}" alt="" width="25" height="25"> 
    </td> 
    <td>{{ cortina.nombre }}</td> 
    <td>{{ "$" ~ cortina.precio|number_format('0',',','.') }}</td> 
</tr> 
+0

実際に '$ entity'が存在することを確認してください。 – jbafford

+0

redirectToRouteメソッドが呼び出される前にエンティティがデータベースに保持されているため、$エンティティが存在します。 – enlego

+0

私は '$ entity 'が' redirectToRoute'を呼んでいるところに実際に存在するのではないかと疑います。追加の文脈を提供できますか?それはあまりにも大きくない場合、おそらくredirectToRouteを呼び出す関数ですか?あるいは、 '$ entity'が定義されている場所から、どこに使われているのかを示すコードパスを少なくとも表示していますか? – jbafford

答えて

11

$parametersは、変数がビューにレンダリングするために、URLのトークンを生成していない使用されていますこれは、リダイレクト先のルートに割り当てられたコントローラによって実行されます。

例:

class FirstController extends Controller 
{ 
    /** 
    * @Route('/some_path') 
    */ 
    public function someAction() 
    { 
     // ... some logic 
     $entity = 'some_value'; 

     return $this->redirectToRoute('some_other_route', array('entity' => $entity)); // cast $entity to string 
    } 
} 

class SecondController extends Controller 
{ 
    /** 
    * @Route('/some_other_path/{entity}', name="some_other_route") 
    */ 
    public function otherAction($entity) 
    { 
     // some other logic 
     // in this case $entity equals 'some_value' 

     $real_entity = $this->get('some_service')->get($entity); 

     return $this->render('view', array('twig_entity' => $real_entity)); 
    } 
} 
+0

この解決策は問題を解決しました。私はotherAction(私が最初にリダイレクトしていたもの)に$エンティティ変数を渡していませんでした。 – enlego

1

$this->redirectToRoute('something', array('id' => 1)$this->redirect($this->generateUrl('something', array('id' => 1)))に便利なラッパーです。あなたのparamsでURLを構築し、paramsの値が文字列か数値かを期待しています。

http://symfony.com/blog/new-in-symfony-2-6-new-shortcut-methods-for-controllers

次に、新しいアクションでデータをフェッチするか、それがredirectToRoute()の呼び出しを打つ前に、データの個々の部分にそれを打破するために、エンティティのIDを渡すのいずれかが必要です。

class MyController extends Controller { 
    public function myAction(){ 
     $cortina = new Cortina(); 
     $cortina->something = "Some text"; 

     $em = $this->getDoctrine()->getManager(); 
     $em->persist($cortina); 
     $em->flush(); 

     return $this->redirectToRoute('frontend_carrodecompras', array(
      'id' => $cortina->getId() 
     ); 
    } 
}