从Doctrine实体创建表格表单

时间:2014-12-15 17:48:56

标签: forms symfony doctrine

我有一个Doctrine实体列表(称为“ Circuit ”),并希望生成一个表单,在< table> 中列出它们并添加一个方法勾选它们进行大量删除(Sonata Admin的功能,无需管理类)。

我到处寻找,但我无法弄清楚我的生活该怎么做。这个类只有一个层(普通旧对象),每次我尝试将集合类型添加到我的表单构建器时,我都会收到以下错误:

  

属性“电路”和方法之一“getCircuits()”,“circuits()”,“isCircuits()”,“hasCircuits()”,“__ get()”,“__ call()”都不存在并在“NetDev \ CoreBundle \ Entity \ Circuit”类中进行公共访问。

我是否应该创建一个“代理”类来创建电路集合?我错过了什么吗?

到目前为止,我发现的所有方法都使用了像“文章”这样的“主”类和像“类别”这样的子类的集合,这些类不适用于我目前的问题。

这是我的 CircuitsController.php (我使用“addAction”进行测试,最终所有内容都将位于indexAction中):

<?php

namespace NetDev\WebManagerBundle\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use NetDev\CoreBundle\Form\CircuitType;
use NetDev\CoreBundle\Entity\Circuit;

class CircuitsController extends Controller {
  public function indexAction($page = 1) {
    $listCircuits = $this->getDoctrine()->getManager()->getRepository('NetDevCoreBundle:Circuit')->findAll();
    $content = $this->get('templating')->render('NetDevWebManagerBundle:Circuits:index.html.twig',
                                                array('listCircuits' => $listCircuits));
    return new Response($content);
  }

  public function addAction(Request $request) {
    $circuit = new Circuit();
    $form = $this->createForm(new CircuitType(), $circuit);

    if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
      /* some action that is not actually relevant */
    }
    return new Response($this->get('templating')->render('NetDevWebManagerBundle:Circuits:add.html.twig',
                                                         array('circuit' => $circuit,
                                                               'form' => $form->createView())));
  }

CircuitType.php 文件:

<?php

namespace NetDev\CoreBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class CircuitType extends AbstractType
{
    /**                                                                                                                                                                                                                                        
     * @param FormBuilderInterface $builder                                                                                                                                                                                                    
     * @param array $options                                                                                                                                                                                                                   
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
          ->add('circuits', 'collection', array('type' => 'entity', 'allow_add' => true,
                                                'allow_delete' => true, 'by_reference' => false,
                                                'label' => false,
                                                'options' => array('class' => 'NetDevCoreBundle:Circuit',
                                                                   'label' => false, 'multiple' => true,
                                                                   'expanded' => true)
                                                ))
          /* ->add('vlanId', 'integer', array('required' => true, 'label' => 'VLAN ID')) */
          /* ->add('popOut', 'text', array('required' => true, 'label' => 'Injecting PoP', */
          /*                             'max_length' => 3)) */
          /* ->add('popsIn', 'textarea', array('required' => true, 'label' => 'Listening PoP')) */
          /* ->add('bandwidth', 'integer', array('label' => 'Bandwidth')) */
          /* ->add('xconnectId', 'text', array('label' => 'Cross-connect ID')) */
          /* ->add('Create', 'submit') */
        ;
    }

    /**                                                                                                                                                                                                                                        
     * @return string                                                                                                                                                                                                                          
     */
    public function getName()
    {
        return 'netdev_corebundle_circuit';
    }
}

最后, Circuit.php 实体文件:

<?php

namespace NetDev\CoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**                                                                                                                                                                                                                                            
 * Circuit                                                                                                                                                                                                                                     
 *                                                                                                                                                                                                                                             
 * @ORM\Table()                                                                                                                                                                                                                                
 * @ORM\Entity(repositoryClass="NetDev\CoreBundle\Entity\CircuitRepository")                                                                                                                                                                   
 */
class Circuit
{
    /**                                                                                                                                                                                                                                        
     * @var integer                                                                                                                                                                                                                            
     *                                                                                                                                                                                                                                         
     * @ORM\Column(name="id", type="integer")                                                                                                                                                                                                  
     * @ORM\Id                                                                                                                                                                                                                                 
     * @ORM\GeneratedValue(strategy="AUTO")                                                                                                                                                                                                    
     */
    private $id;

    /**                                                                                                                                                                                                                                        
     * @var integer                                                                                                                                                                                                                            
     *                                                                                                                                                                                                                                         
     * @ORM\Column(name="vlan_id", type="integer")                                                                                                                                                                                             
     * @Assert\Type(type="int")                                                                                                                                                                                                                
     * @Assert\Range(min="1", max="4096")                                                                                                                                                                                                      
     */
    private $vlanId;

    /**                                                                                                                                                                                                                                        
     * @var array                                                                                                                                                                                                                              
     *                                                                                                                                                                                                                                         
     * @ORM\Column(name="pop_out", type="array")                                                                                                                                                                                               
     * @Assert\NotBlank()                                                                                                                                                                                                                      
     * @Assert\Length(max=3)                                                                                                                                                                                                                   
     */
    private $popOut;

    /**                                                                                                                                                                                                                                        
     * @var array                                                                                                                                                                                                                              
     *                                                                                                                                                                                                                                         
     * @ORM\Column(name="pops_in", type="array")                                                                                                                                                                                               
     * @Assert\NotBlank()                                                                                                                                                                                                                      
     */
    private $popsIn;

    /**                                                                                                                                                                                                                                        
     * @var integer                                                                                                                                                                                                                            
     *                                                                                                                                                                                                                                         
     * @ORM\Column(name="bandwidth", type="integer")                                                                                                                                                                                           
     * @Assert\Type(type="int")                                                                                                                                                                                                                
     */
    private $bandwidth;

    /**                                                                                                                                                                                                                                        
     * @var string                                                                                                                                                                                                                             
     *                                                                                                                                                                                                                                         
     * @ORM\Column(name="xconnect_id", type="string", length=255)                                                                                                                                                                              
     * @Assert\NotBlank()                                                                                                                                                                                                                      
     * @Assert\Length(max="255")                                                                                                                                                                                                               
     */
    private $xconnectId;

    /* Getters and Setters stripped for clarity's sake */

    public function __toString() {
      return "{$this->vlanId}-{$this->popOut}";
    }
}

如果你需要树枝模板告诉我,我还没有添加它,因为我甚至没有接近从该例外输出的东西。

1 个答案:

答案 0 :(得分:0)

正如@Cerad所说,这里的答案是传递

的结果
$listCircuits = $this->getDoctrine()->getManager()->getRepository('NetDevCoreBundle:Circuit')->findAll();

直接收藏。之后一切都很顺利。