Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony2-Misd phonnumberbundle:无法转换属性路径的值;电话号码:应为\libphonenumber\PhoneNumber_Symfony - Fatal编程技术网

Symfony2-Misd phonnumberbundle:无法转换属性路径的值;电话号码:应为\libphonenumber\PhoneNumber

Symfony2-Misd phonnumberbundle:无法转换属性路径的值;电话号码:应为\libphonenumber\PhoneNumber,symfony,Symfony,下面是我的实体、表单和DBAL配置,用于misd phonenumberbundle与Symfony2.8集成。但我仍然得到下面的错误,有人能让我知道如何解决这个问题吗?我写了几行代码将字符串转换为PhoneNumber obj,然后表单可以正常加载,但我的问题是我们需要显式转换吗?这不是自动处理的吗 实体条目: /** * @ORM\Column(type="phone_number", nullable=true) * @AssertPhoneNumber(defaultRegion="US

下面是我的实体、表单和DBAL配置,用于misd phonenumberbundle与Symfony2.8集成。但我仍然得到下面的错误,有人能让我知道如何解决这个问题吗?我写了几行代码将字符串转换为PhoneNumber obj,然后表单可以正常加载,但我的问题是我们需要显式转换吗?这不是自动处理的吗

实体条目:

/**
* @ORM\Column(type="phone_number", nullable=true)
* @AssertPhoneNumber(defaultRegion="US", message="Please specify a valid phone number")
*/
private $phoneNumber;
doctrine:
dbal:
types:
phone_number: Misd\PhoneNumberBundle\Doctrine\DBAL\Types\PhoneNumberType
->add('phoneNumber', PhoneNumberType::class, array('default_region' => 'US', 'format' => PhoneNumberFormat::NATIONAL, 'required' => false))
DBAL映射:

/**
* @ORM\Column(type="phone_number", nullable=true)
* @AssertPhoneNumber(defaultRegion="US", message="Please specify a valid phone number")
*/
private $phoneNumber;
doctrine:
dbal:
types:
phone_number: Misd\PhoneNumberBundle\Doctrine\DBAL\Types\PhoneNumberType
->add('phoneNumber', PhoneNumberType::class, array('default_region' => 'US', 'format' => PhoneNumberFormat::NATIONAL, 'required' => false))
表格:

/**
* @ORM\Column(type="phone_number", nullable=true)
* @AssertPhoneNumber(defaultRegion="US", message="Please specify a valid phone number")
*/
private $phoneNumber;
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:    
未捕获的PHP异常Symfony\Component\Form\Exception\TransformationFailedException:无法转换属性路径“phone\u number”的值:webapp/vendor/Symfony/Symfony/Symfony/src/Symfony/Component/Form/Form.PHP第1149行应为\libphonenumber\PhoneNumber


下面是我的解决方案。我没有在app/config.yml中进行任何类型的原则映射

此解决方案假定在AppKernel.php中注册了MisdPhonenumber包

  • 创建数据转换器:src/Example/Bundle/Form/DataTransformer.php
  • 数据转换器类

    <?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 '';
        }
    }
    
  • 在配置文件中将表单类型定义为服务:
  • 表单类型即服务

    # 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 }
    

    您可能需要使用转换器(请参阅官方SF2文档以获取解释:)。这个包可能附带了一个。顺便说一下,看看包的自述,表单字段是文本字段:谢谢@thoroc。我通过使用Symfony DataTransformer component.Nice修复了这个问题。现在,您可以添加此问题的答案和解决方案。:)谢谢你@Dhananjay!您的代码示例允许我更正错误并成功地将PhoneNumber添加到表单中。然而,我并没有像
    symfonyv3.4
    with
    Flex
    那样将表单类型添加为服务,它们是自动处理的。