Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.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/8/api/5.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
Php Symfony2-如何在Api和客户端/前端之间共享/重用表单、实体和验证_Php_Api_Rest_Symfony - Fatal编程技术网

Php Symfony2-如何在Api和客户端/前端之间共享/重用表单、实体和验证

Php Symfony2-如何在Api和客户端/前端之间共享/重用表单、实体和验证,php,api,rest,symfony,Php,Api,Rest,Symfony,我真的想要一个关于如何重用表单类型、实体(对象)以及后端API和一些其他前端/客户端代码之间的验证约束的经验的指针和答案 具体而言: 我有一个托管实体,比如Product.php。 ProductType.php,其中包含validation.yml中实体的表单定义和验证规则 我将它们放在单独的存储库中,并要求在Api和客户端代码中使用composer。 来自Api的响应将是序列化的产品对象。在客户端,我将从json反序列化到同一个产品,但这次没有访问任何db层,例如非托管普通对象 所以问题是,

我真的想要一个关于如何重用表单类型、实体(对象)以及后端API和一些其他前端/客户端代码之间的验证约束的经验的指针和答案

具体而言: 我有一个托管实体,比如Product.php。 ProductType.php,其中包含validation.yml中实体的表单定义和验证规则

我将它们放在单独的存储库中,并要求在Api和客户端代码中使用composer。 来自Api的响应将是序列化的产品对象。在客户端,我将从json反序列化到同一个产品,但这次没有访问任何db层,例如非托管普通对象

所以问题是,是否有人能够在类似的环境中重用这些组件,或者指出如何管理这些组件的一些资源? 用例是:目标代码的集中位置。更快的客户端实现等

到目前为止,我遇到的主要问题是,当在表单中定义时,如何管理与实体/选择类型的关系,因为实体类型需要按原则管理对象。选择类型不知道如何使用对象数组作为选择

这是否值得费心,还是在api和客户端上都有几乎相同的代码更好

示例对象如下: ` }
`

您是否在api中使用表单?i、 e:这两种字段类型(实体和选项)都将在表单中使用吗?因为如果您只在客户端使用它,它将始终是一种选择类型。@user2268997-这就是重点。。我想在服务器端和客户端都使用上面的表单。用预先设置的数据决定它是实体还是选择字段。将更新代码示例以使其更清晰。您希望如何使用PRE_SET_数据进行更新?i、 e:你将如何确定提交的数据是来自服务器还是客户端?@user2268997-我可以检查对象是否由条令管理。如果不是,则在客户端中。。也许更好的方法是在表单类型中添加setter,并手动设置数据。如。setEntities/setObject。。并根据提供的数据作出决定。。实际上有很多方法。我认为您必须强制执行一些约定服务器端,例如:在表单上提交数据,以便能够自动检测表单提交的位置。(除非您想连接到
FormInterface::handleRequest
)。然而,这是一种有趣的方法。通过牺牲一些通用性(和优雅性),您可以在所有表单中添加一个选项(带有表单扩展),以便在
buildForm
方法中创建正确的表单,以基于该选项的值构建表单,该选项告诉您表单是为API还是UI创建的。(有点像
setEntity
方法)
 public function buildForm(FormBuilderInterface $builder, array $options)
 {
    $builder->add('name', 'text')
            ->add('price', 'text')

            // use PRE_SET_DATA EVENT to determine if entity or choice here
            // this should be used on the server side, with access to db
            ->add('tags', 'entity', [
                'class'        => 'Acme\MyBundle\Tag',
                'multiple'     => true
             ]);
            // This should be used in the client, without access to db
            //->add('tags', 'choice', [
            //    'data_class' => 'Acme\MyBundle\Tag',
            //    'choices'    => $arrayOfTagObjects,
            //    'multiple'   => true
            // ]);
}