2016-11-07 24 views
1

以下是我的實體,表單和DBAL配置爲misd-phonenumberbundle與Symfony2.8集成。但是我仍然得到下面的錯誤,有人可以讓我知道如何解決這個問題嗎?我寫了幾行代碼將字符串轉換爲PhoneNumber obj,然後表單加載正常,但我的問題是我們需要顯式地將其轉換嗎?這是不是自動處理?Symfony2 - 錯誤phonnumberbundle:無法轉換屬性路徑「phone_number」的值:預期 libphonenumber PhoneNumber

實體條目:

/** 
* @ORM\Column(type="phone_number", nullable=true) 
* @AssertPhoneNumber(defaultRegion="US", message="Please specify a valid phone number") 
*/ 
private $phoneNumber; 

DBAL映射:

doctrine: 
dbal: 
types: 
phone_number: Misd\PhoneNumberBundle\Doctrine\DBAL\Types\PhoneNumberType 

表:

->add('phoneNumber', PhoneNumberType::class, array('default_region' => 'US', 'format' => PhoneNumberFormat::NATIONAL, 'required' => false)) 

自定義代碼來處理錯誤:

if($user->getphoneNumber()!="") 
{ 
    $util = $this->container->get('libphonenumber.phone_number_util'); 
    $phoneNUmber = $util->parse($user->getphoneNumber(), "US"); 
    $user->setphoneNumber($phoneNUmber); 
} 
else 
{ 
    $phoneNUmber = new \libphonenumber\PhoneNumber; 
    $user->setphoneNumber($phoneNUmber); 
} 

Error:  

Uncaught PHP Exception Symfony\Component\Form\Exception\TransformationFailedException: Unable to transform value for property path "phone_number": Expected a \libphonenumber\PhoneNumber at webapp/vendor/symfony/symfony/src/Symfony/Component/Form/Form.php line 1149

+0

您可能需要使用變壓器(有關說明,請參閱官方SF2文檔:http://symfony.com/doc/current/form/data_transformers.html)。這個捆綁包可能附帶一個。 – thoroc

+0

順便說一下,查看包的自述文件,表單域是一個文本:https://github.com/misd-service-development/phone-number-bundle#using-libphonenumberphonenumber-objects-in-forms – thoroc

+0

謝謝@thoroc。我通過使用Symfony DataTransformer組件解決了這個問題。 – Dhananjay

回答

2

下面是我的解決辦法。我沒有做過任何一種學說映射在app/config.yml

此解決方案假定MisdPhonenumber束在AppKernel.php

  1. 創建數據變壓器註冊:SRC /例/包/表/DataTransformer.php

Data Transformer Class

<?php 

namespace Example\Bundle\Form\DataTransformer; 

use libphonenumber\PhoneNumber; 
use libphonenumber\PhoneNumberFormat; 
use Symfony\Component\Form\DataTransformerInterface; 

class StringToPhoneNumberTransformer implements DataTransformerInterface 
{ 

    // The 'libphonenumber.phone_number_util' service 
    private $phoneNumberUtil; public function __construct($util) 
    { 
     $this->phoneNumberUtil = $util; 
    } 

    /** 
    * Transforms a string (number) to an object (PhoneNumber) 
    * 
    * @param string $phoneNumberString 
    * @return PhoneNumber 
    */ 
    public function transform($phoneNumberString) 
    { 
     if ($phoneNumberString != "") 
     { 
      return $this->phoneNumberUtil->parse($phoneNumberString, "US"); 
     } 
     return new PhoneNumber; 
    } 

    /** 
    * Transforms a string (number) to an object (issue). 
    * 
    * @param PhoneNumber $phoneNumberObject 
    * @return string 
    */ 
    public function reverseTransform($phoneNumberObject) 
    { 
     if ($phoneNumberObject != null) 
     { 
      return $this->phoneNumberUtil->format($phoneNumberObject, PhoneNumberFormat::NATIONAL); 
     } 
     return ''; 
    } 
} 
  • 表格使用數據變壓器
  • Data Transformer in Form

    <?php 
    
    namespace Example\Bundle\Form\Type\User; 
    
    use Example\Bundle\Entity\User; 
    use Example\Bundle\Form\DataTransformer\StringToPhoneNumberTransformer; 
    use Example\Bundle\Services\States; 
    use libphonenumber\PhoneNumberFormat; 
    use Misd\PhoneNumberBundle\Form\Type\PhoneNumberType; 
    use Symfony\Component\Form\AbstractType; 
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 
    use Symfony\Component\Form\Extension\Core\Type\EmailType; 
    use Symfony\Component\Form\Extension\Core\Type\SubmitType; 
    use Symfony\Component\Form\Extension\Core\Type\TextType; 
    use Symfony\Component\Form\FormBuilderInterface; 
    use Symfony\Component\OptionsResolver\OptionsResolver; 
    
    class ContactInfoType extends AbstractType 
    { 
        // The 'libphonenumber.phone_number_util' service private $phoneNumberUtil; 
        public function __construct($util) 
        { 
         $this->phoneNumberUtil = $util; 
        } 
    
        public function buildForm(FormBuilderInterface $builder, array $options) 
        { 
         $builder->add('salutation', TextType::class, array('max_length' => 10, 'required' => false)) 
          ->add('firstName', TextType::class, array('max_length' => 30)) 
          ->add('lastName', TextType::class, array('max_length' => 30)) 
          ->add('email', EmailType::class, array('max_length' => 150)) 
          ->add('phone', PhoneNumberType::class, 
           array('default_region' => 'US', 'format' => PhoneNumberFormat::NATIONAL, 'required' => false)) 
          ->add('stAddress1', TextType::class, 
           array('label' => 'Address Line 1', 'max_length' => 60, 'required' => false)) 
          ->add('stAddress2', TextType::class, 
           array('label' => 'Address Line 2', 'max_length' => 60, 'required' => false)) 
          ->add('city', TextType::class, array('max_length' => 30, 'required' => false)) 
          ->add('state', ChoiceType::class, 
           array('choices' => States::getStates(), 'required' => false, 'choices_as_values' => true)) 
          ->add('zip', TextType::class, array('max_length' => 5, 'required' => false)) 
          ->add('submit', SubmitType::class); 
    
         $builder->get('phone')->addModelTransformer(new StringToPhoneNumberTransformer($this->phoneNumberUtil)); 
        } 
    
        public function getBlockPrefix() 
        { 
         return 'ContactInfo'; 
        } 
    
        public function configureOptions(OptionsResolver $resolver){ 
         // Explicitly bind data class of form. 
         $resolver->setDefaults([ 
          'data_class' => User::class 
         ]); 
        } 
    } 
    
  • 定義形式類型作爲服務配置文件:
  • Form type as a service

    # src/Example/Bundle/Resources/config/services.yml 
    
    services: 
        example.form.contactinfo: 
         class: Example\Bundle\Form\Type\User\ContactInfoType 
        arguments: ["@libphonenumber.phone_number_util"] 
        tags: 
         - { name: form.type } 
    
    +0

    謝謝@Dhananjay!您的代碼示例允許我糾正錯誤併成功將PhoneNumber添加到表單中。然而,我沒有在'Symfony v3.4'中添加表單類型作爲服務,'Flex'是自動處理的。 – Rikijs

    相關問題