Symfony 2 - 具有一种形式的多个实体

I've got the following tables with relationships:

  • UserAddress table (Holds basic information for the address)
  • UserAddressFields table (Holds the value for each field associated to an address)
  • UserAddressFieldsTranslation table (Holds the field ids)
  • UserStates table (Holds the values of all the states in the US and the abbreviations)

UserAddress has 2 foreign keys:

  • Profile_id -> useraccounts.id
  • state_id -> userstates.id

UserAddressFields has one foreign key:

  • address_id -> useraddress.id

I've created entities for all 4 of these tables (Getters and Setters have been removed to save space, generated via console):

UserAddress.php

<?php
namespace SCWDesignsBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use SCWDesignsBundle\Entity\UserStates;
use UsersBundle\Entity\User;

/**
 * @ORM\Entity(repositoryClass="SCWDesignsBundle\Entity\Repository\
UserAddressesRepository")
 * @ORM\Table(name="user_addresses")
 */
class UserAddresses {
    /**
     * @ORM\ID
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="UsersBundle\Entity\User")
     * @ORM\JoinColumn(name="profile_id", referencedColumnName="id")
     */
    protected $profile_id;

    /**
     * @ORM\ManyToOne(targetEntity="UserStates")
     * @ORM\JoinColumn(name="state_id", referencedColumnName="id")
     */
    protected $state_id;

    /**
     * @ORM\Column(type="boolean")
     */
    protected $isBilling;

    /**
     * @ORM\Column(type="boolean")
     */
    protected $isShipping;

    /**
     * @ORM\Column(type="string", columnDefinition="CHAR(1)")
     */
    protected $addressType;

UserAddressFieldsTranslation.php

<?php
namespace SCWDesignsBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use SCWDesignsBundle\Entity\UserAddressFields;
use UsersBundle\Entity\User;

/**
 * @ORM\Entity(repositoryClass="SCWDesignsBundle\Entity\Repository\UserAddressFieldsTranslationRepository")
 * @ORM\Table(name="user_address_fields_translation")
 */
class UserAddressFieldsTranslation {
    /**
     * @ORM\ID
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", columnDefinition="VARCHAR(255) NOT NULL")
     */
    protected $name;

UserStates.php

<?php
namespace SCWDesignsBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="SCWDesignsBundle\Entity\Repository\StatesRepository")
 * @ORM\Table(name="user_states")
 */
class UserStates {
    /**
     * @ORM\ID
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", columnDefinition="CHAR(2)")
     */
    protected $country_code;

    /**
     * @ORM\Column(type="string", columnDefinition="VARCHAR(64)")
     */
    protected $state;

I have 2 form types, UserAddressFormType and UserAddressFieldsFormType.

UserAddressFormType

<?php
namespace SCWDesignsBundle\Form\Type;

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

class UserAddressFormType extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
            ->add('profile_id', null, array('label' => 'Profile ID'))
            ->add('state_id', null, array('label' => 'State ID'))
            ->add('isBilling', null, array('label' => 'Billing Address'))
            ->add('isShipping', null, array('label' => 'Shipping Address'))
            ->add('addressType', null, array('label' => 'Address Type'))
            ->add('addressFields', new UserAddressFieldsFormType());
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'SCWDesignsBundle\Entity\UserAddresses'
        ));
    }

    public function getName() {
        return 'UserAddressFormType';
    }
}

UserAddressFieldsFormType.php

<?php
namespace SCWDesignsBundle\Form\Type;

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

class UserAddressFieldsFormType extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
            ->add('address_id', null, array('label' => 'Address Field'))
            ->add('address_field_id', null, array('label' => 'Address Field ID'))
            ->add('value', null, array('label' => 'Value'));
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'SCWDesignsBundle\Entity\UserAddressFields'
        ));
    }

    public function getName() {
        return 'UserAddressFieldsFormType';
    }
}

In the controller is your basic form call. ProfileController.php

<?php
namespace SCWDesignsBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use SCWDesignsBundle\Entity\UserAddresses;
use SCWDesignsBundle\Form\Type\UserAddressFormType;
use SCWDesignsBundle\Form\Type\UserAddressFieldsFormType;

class ProfileController extends Controller {
    public function editAddressAction() {
        $address = new UserAddresses();
        $form_address = $this->createForm(new UserAddressFormType(), $address);


        $request = $this->getRequest();
        if ($request->getMethod() == 'POST') {
            // Perform some action.

            return $this->redirect($this->generateUrl('fos_user_profile_show'));
        }



        return $this->render('SCWDesignsBundle:Profile:edit.html.twig', array(
            'active_page' => 'profile',
            'form_address' => $form_address->createView(),
        ));
    }
}

Everywhere I've read this is the correct means of adding another entity to your form builder but everytime I do this, or any other variation I've ran across I get the following error

Neither the property "addressFields" nor one of the methods
"getAddressFields()", "isAddressFields()", "hasAddressFields()", "__get()" exist
and have public access in class "SCWDesignsBundle\Entity\UserAddresses".
查看全部
dongyi2006
dongyi2006
2015/04/09 19:31
  • php
  • mysql
  • symfony
  • forms
  • 点赞
  • 收藏
  • 回答
    私信
满意答案
查看全部

2个回复