Php 如何映射产品实体,以便按照条令进行管理?
我试图在PS 1.7.6.1下构建一个模块 在设计中,我在一个产品和一个预订单(多个预订单可以关联到一个产品)之间有一个多单关系 预订单对象是ORM实体:Php 如何映射产品实体,以便按照条令进行管理?,php,symfony,doctrine,prestashop,prestashop-1.7,Php,Symfony,Doctrine,Prestashop,Prestashop 1.7,我试图在PS 1.7.6.1下构建一个模块 在设计中,我在一个产品和一个预订单(多个预订单可以关联到一个产品)之间有一个多单关系 预订单对象是ORM实体: //mymodule/src/Entity class Preorder { /** * @var int * * @ORM\Id * @ORM\Column(name="id_preorder", type="integer") * @ORM\GeneratedValue(strat
//mymodule/src/Entity
class Preorder
{
/**
* @var int
*
* @ORM\Id
* @ORM\Column(name="id_preorder", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var int
*
* @ORM\Column(name="id_product", type="integer")
*/
private $productId;
/**
* @var string
*
* @ORM\Column(name="email", type="string", length=64)
*/
private $email;
setter and getter
}
在控制器中:
//src/mymodule/src/Controller
use Doctrine\DBAL\Types\TextType;
use PrestaShopBundle\Controller\Admin\FrameworkBundleAdminController;
use Doctrine\ORM\EntityManagerInterface;
use MyModule\Entity\Preoder;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\HttpFoundation\Request;
use Product;
class PreorderController extends FrameworkBundleAdminController
{
public function createAction(Request $request){
$preorder = new Preorder();
$preorderForm = $this->createFormBuilder($preorder)
->add('email', EmailType::class)
->add('productId', EntityType::class, [
'class' => Product::class,
])
->getForm();
$bookingForm->handleRequest($request);
// validate and persist
}}
问题是表单生成器无法识别产品实体。它会引发运行时异常:
“产品”类似乎不是一个管理主义实体。是吗
忘了画地图了吗
我在核心文件中找不到处理此类场景的示例。非常感谢您提前指导/帮助我解决此问题。主要问题是
产品id
不是一个实体,因此formbuilder
使用EntityType::class
处理此问题的可能性为零。您需要正确定义(如中所述)与对象的manytone关系
在产品方面:
/**
*@ORM\Entity(repositoryClass=“App\Repository\ProductRepository”)
*/
类产品
{
//平常的东西
/**
*@ORM\manytone(targetEntity=“App\Entity\User”,inversedBy=“product”,cascade={“persist”})
*/
私人$preorder;
}
在预订方面:
/**
*@ORM\Entity(repositoryClass=“App\Repository\ProductRepository”)
*/
类产品
{
//平常的东西
/**
*@ORM\OneToMany(targetEntity=“App\Entity\Product”,mappedBy=“preorders”)
*/
私人产品;
}
在formBuilder中,产品
将是一个实体
,并通过EntityType::class
编辑
如果您的产品
是ORM未映射的遗留类,则可以使用帮助formBuilder识别遗留实体
namespace-App\DataTransformer;
类ProductToIdTransformer实现DataTransformerInterface
{
公共职能转变($产品)
{
如果(null==$product){
返回“”;
}
返回$product->getId();
}
公共函数反向转换($product\U id)
{
如果(!$product\U id){
回来
}
//用于检索产品的数据库逻辑
如果(空==$字段){
抛出新的TransformationFailedException(sprintf(“产品'%s'不存在!”,$product_id));
}
退回$product;
}
}
然后在formbuilder中,您将使用:
$preorderForm=$this->createFormBuilder($preorder)
->添加('email',EmailType::class)
->添加('product',CollectionType::class[
'class'=>Product::class,
//根据您的需要调整不同选择的一些逻辑
])
;
$preorderForm
->获取('产品')
->addModelTransformer(ProductToIdTransformer::类)
;
$preorderForm=$preorderForm->getForm();
我们能看到这种关系的产品方面吗?我完全同意你的看法。您提供的两个代码片段中的问题是:它们假定产品是ORM实体,而产品是遗留代码()中的一个简单类。这个类还没有迁移到一个条令实体(以我拙劣的理解)。我可以在迁移的代码中看到,他们设法使用适配器实例化一个产品对象,并在控制器中使用它,但这种情况又如何呢?srroy,我没有将其作为遗留代码。看一看,它可能会使技巧和使用collectionType
代替谢谢你的信息链接。使用数据转换器听起来是个好主意。我会试着回来了解细节。您可以编辑您的答案吗?我添加了一种处理未映射类的方法,请注意这是一个更复杂的过程,您需要实现自己的逻辑来检索CollectionType
的选项,以便对未来的读者最诚实,我最终没有使用数据转换器,因为我发现我的OP没有正确描述我的问题。在阅读文档和您提供的编辑后,我确信OP需要这个答案,所以我将其标记为正确。非常感谢你,皮尔里克