如何映射产品实体,以便由Doctrine管理?

问题描述 投票:0回答:1

我正在尝试在PS 1.7.6.1。下构建模块。

在设计中,我在产品和预购商品之间存在多对一关系(许多预购商品可以与一个产品相关联。

Preorder对象是ORM实体:

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

问题是表单生成器无法识别产品实体。它抛出运行时异常:

“产品”类似乎不是受管学说的实体。你是否忘记映射了?

我在核心文件中找不到处理这种情况的示例。提前非常感谢您指导/帮助我解决了此问题。

php symfony doctrine prestashop prestashop-1.7
1个回答
1
投票

主要问题是product_id不是实体,因此formbuilderEntityType::class进行处理的可能性为0。您需要正确定义(如doc中所述)与对象的ManyToOne关系

在产品侧:

/**
 * @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
 */
class Product
{
    // usual stuff

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="product", cascade={"persist"})
     */
    private $preorders;
}

并且在预购方面:

/**
 * @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
 */
class Product
{
    // usual stuff

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Product", mappedBy="preorders")
     */
    private $product;
}

在您的formBuilder中,product将是一个entity,并由此被EntityType::class识别出来

编辑

如果您的product是ORM未映射的旧类,则可以使用dataTransformer帮助formBuilder识别旧实体。

namespace App\DataTransformer;

class ProductToIdTransformer implements DataTransformerInterface
{
    public function transform($product)
    {
        if (null === $product) {
            return '';
        }

        return $product->getId();
    }

    public function reverseTransform($product_id)
    {
        if (!$product_id){
            return;
        } 

        //your db logic to retrieve the product

        if (null === $field){
            throw new TransformationFailedException(sprintf("the product '%s' does not exist!", $product_id));
        }

        return $product;

    }
}

然后在您的formbuilder中,您将使用CollectionType

CollectionType
© www.soinside.com 2019 - 2024. All rights reserved.