我尝试将一个表单类型嵌入另一个表单类型:
- $builder->add('geolocation',new GeolocationType());
但是当我尝试绑定请求到表单
- if($request->getMethod() == 'POST') {
- $form->bindRequest($request);
- }
我得到错误
Catchable Fatal Error: Argument 1 passed to Company\StoreBundle\Document\Place::setGeolocation()
must be an instance of Company\StoreBundle\Document\Geolocation,array given,called in
/var/www/Company/vendor/symfony/src/Symfony/Component/Form/Util/PropertyPath.PHP on line 392 and
defined in /var/www/Company/src/Company/StoreBundle/Document/Place.PHP line 43
data_class是为PlaceType和GeolocationType设置的
这是我的代码:
Place.PHP
- namespace Company\StoreBundle\Document;
- use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
- /**
- * @MongoDB\Document(collection="places")
- */
- class Place
- {
- /**
- * @MongoDB\Id
- */
- private $id;
- /**
- * @MongoDB\String
- */
- private $title;
- /**
- * @MongoDB\EmbedOne(targetDocument="Geolocation")
- */
- private $geolocation;
- /**
- * Get id
- *
- * @return id $id
- */
- public function getId()
- {
- return $this->id;
- }
- /**
- * Set geolocation
- *
- * @param Company\StoreBundle\Document\Geolocation $geolocation
- */
- public function setGeolocation(\Company\StoreBundle\Document\Geolocation $geolocation)
- {
- $this->geolocation = $geolocation;
- }
- /**
- * Get geolocation
- *
- * @return Company\StoreBundle\Document\Geolocation $geolocation
- */
- public function getGeolocation()
- {
- return $this->geolocation;
- }
- /**
- * Set title
- *
- * @param string $title
- */
- public function setTitle($title)
- {
- $this->title = $title;
- }
- /**
- * Get title
- *
- * @return string $title
- */
- public function getTitle()
- {
- return $this->title;
- }
- }
Geolocation.PHP
- namespace Company\StoreBundle\Document;
- use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
- /**
- * @MongoDB\EmbeddedDocument
- */
- class Geolocation
- {
- /**
- * @MongoDB\Id
- */
- private $id;
- /**
- * @MongoDB\Float
- */
- private $latitude;
- /**
- * @MongoDB\Float
- */
- private $longitude;
- /**
- * Get id
- *
- * @return id $id
- */
- public function getId()
- {
- return $this->id;
- }
- /**
- * Set latitude
- *
- * @param float $latitude
- */
- public function setLatitude($latitude)
- {
- $this->latitude = $latitude;
- }
- /**
- * Get latitude
- *
- * @return float $latitude
- */
- public function getLatitude()
- {
- return $this->latitude;
- }
- /**
- * Set longitude
- *
- * @param float $longitude
- */
- public function setLongitude($longitude)
- {
- $this->longitude = $longitude;
- }
- /**
- * Get longitude
- *
- * @return float $longitude
- */
- public function getLongitude()
- {
- return $this->longitude;
- }
- }
PlaceType.PHP
- namespace Company\AdminBundle\Form\Type;
- use Symfony\Component\Form\AbstractType;
- use Symfony\Component\Form\FormBuilder;
- use Company\AdminBundle\Form\Type\GeolocationType;
- class PlaceType extends AbstractType
- {
- public function buildForm(FormBuilder $builder,array $options)
- {
- $builder->add('title');
- $builder->add('geolocation',new GeolocationType());
- }
- public function getName()
- {
- return 'place';
- }
- public function getDefaultOptions(array $options)
- {
- return array(
- 'data_class' => 'Company\StoreBundle\Document\Place',);
- }
- }
GeolocationType.PHP
- namespace Company\AdminBundle\Form\Type;
- use Symfony\Component\Form\AbstractType;
- use Symfony\Component\Form\FormBuilder;
- class GeolocationType extends AbstractType
- {
- public function buildForm(FormBuilder $builder,array $options)
- {
- $builder
- ->add('latitude')
- ->add('longitude');
- }
- public function getDefaultOptions(array $options)
- {
- return array('data_class' => 'Company\StoreBundle\Document\Geolocation');
- }
- public function getName()
- {
- return 'geolocation';
- }
- }
谢谢你们
在这种情况下,我觉得你不应该在你的setter方法中使用依赖关系
所以代替:
所以代替:
- setGeolocation(\Company\StoreBundle\Document\Geolocation $geolocation)
尝试这样看看它是否正常工作:
- setGeolocation($geolocation)