2016-01-04 12 views
14

Tôi có vấn đề nhỏ với Loại tùy chỉnh trong trường của biểu mẫu: Tôi đang cố gắng thêm "Loại hình ảnh" liên quan đến thực thể "Hình ảnh", có "url" và "alt" làm biến.
tôi nhận được lỗi này:Thêm một ImageType bên trong một biểu mẫu: "không thể đọc chỉ mục ... không triển khai ArrayAccess"?

Không thể đọc chỉ số "url" từ đối tượng của loại "Proxies__CG __ \ OC \ PlatformBundle \ Entity \ Image" vì nó không thực hiện \ ArrayAccess.

Đây là Type:

<?php 
// src/OC/PlatformBundle/Form/ImageType.php 

namespace OC\PlatformBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 

class ImageType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
    $builder 
     ->add('url', TextType::class) 
     ->add('alt', TextType::class) 
    ; 
    } 

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

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

Hình thức:

class AdvertType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
    $builder 
     ->add('title', TextType::class) 
     ->add('date', DateType::class) 
     ->add('categories', EntityType::class, array(
      'class' => 'OCPlatformBundle:Category', 
      'choice_label' => 'name', 
      'multiple' => true 
     )) 
     ->add('image', ImageType::class) 
     ->add('save', SubmitType::class, array('label' => 'Create Task')) ; 
    } 

Và thực thể:

<?php 

namespace OC\PlatformBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Image 
* 
* @ORM\Table(name="image") 
* @ORM\Entity(repositoryClass="OC\PlatformBundle\Repository\ImageRepository") 
*/ 
class Image 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="url", type="string", length=255) 
    */ 
    private $url; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="alt", type="string", length=255) 
    */ 
    private $alt; 


    /** 
    * Get id 
    * 
    * @return int 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set url 
    * 
    * @param string $url 
    * 
    * @return Image 
    */ 
    public function setUrl($url) 
    { 
     $this->url = $url; 

     return $this; 
    } 

    /** 
    * Get url 
    * 
    * @return string 
    */ 
    public function getUrl() 
    { 
     return $this->url; 
    } 

    /** 
    * Set alt 
    * 
    * @param string $alt 
    * 
    * @return Image 
    */ 
    public function setAlt($alt) 
    { 
     $this->alt = $alt; 

     return $this; 
    } 

    /** 
    * Get alt 
    * 
    * @return string 
    */ 
    public function getAlt() 
    { 
     return $this->alt; 
    } 
} 

tôi không có bất kỳ Array trong lớp Image , vì vậy tôi không chắc chắn những gì ném vấn đề.

+0

Bạn có thể cần phải thực hiện 'getParent() 'chức năng để biểu thị rằng bạn muốn điều này để mở rộng' EntityType 'class (Symfony \ Bridge \ Doctrine \ Form \ Type \ EntityType) –

+0

@JasonRoman Cảm ơn, tôi đã chỉnh sửa bài viết của mình, tôi đã thêm' getParent() 'nhưng nó ném một lỗi. – Paul

+0

Suy nghĩ về nó nhiều hơn, bạn sẽ không muốn nó là EntityType vì bạn có một biểu mẫu mới với nhiều trường và EntityType sẽ chỉ là một lựa chọn duy nhất mà bạn đang chọn. Bạn đã tạo mẫu Twig cho trường mới của mình chưa? –

Trả lời

30

Bạn nhận được lỗi này vì Symfony đang tìm lớp dữ liệu thuộc loại biểu mẫu của bạn nhưng không thể tìm thấy nó. Mã của bạn sẽ làm việc cho các phiên bản Symfony 2.x, trong đó setDefaultOptions() là hợp lệ. Bắt đầu với Symfony 2.7, phương thức đó là deprecated in favor of configureOptions() và bị xóa hoàn toàn trong 3.0.

Vì vậy, chức năng của bạn tồn tại trong lớp biểu mẫu của bạn nhưng nó sẽ không bao giờ được tham chiếu bởi Symfony. Thanh công cụ gỡ lỗi của bạn thậm chí có thể không hiển thị sự phản đối này vì nó đã bị xóa hoàn toàn trong 3.0. Các loại biểu mẫu đơn giản có thể không có lỗi nếu bạn mắc lỗi tương tự, nhưng setDefaultOptions() sẽ không bao giờ được gọi trong cả hai trường hợp, vì vậy tôi sẽ xem xét và kiểm tra các biểu mẫu khác của bạn để đảm bảo chúng cũng hợp lệ.

Là một giải pháp, thay đổi này:

use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class AdvertType extends AbstractType 
{ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'OC\PlatformBundle\Entity\Image', 
     )); 
    } 
} 

này:

use Symfony\Component\OptionsResolver\OptionsResolver; 

class AdvertType extends AbstractType 
{ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'OC\PlatformBundle\Entity\Image', 
     )); 
    } 
} 
+0

Nó cũng hoạt động như một nét duyên dáng nếu bạn thay đổi data_class thành Image :: class – murtho

+0

True, và với phiên bản mới hơn của Symfony nên là phương thức ưa thích –

Các vấn đề liên quan