【问题标题】:How to override SyliusCoreBundle Model User如何覆盖 SyliusCoreBundle 模型用户
【发布时间】:2013-11-11 11:03:32
【问题描述】:

我尝试在模型用户 (SyliusCoreBundle/Model/User) 中添加一个新字段“电话”。 避免接触 SyliusCoreBundle,

我在其他 sylius 捆绑包旁边创建了一个新捆绑包“ShopBundle”以覆盖基本用户类:

src/Sylius/Bundle/ShopBundle

在文件夹 ShopBundle 中:

> /Controller(empty)

> /DependencyInjection(empty)

> /Model

>         /User.php
> /Resources

>         /config/doctrine/model/user.orm.xml
>         /config/service.xml (empty)
> SyliusShopBundle.php

在文件src/Sylius/Bundle/ShopBundle/Model/User.php 中,我有:

    <?php

namespace Sylius\Bundle\ShopBundle\Model;

use Sylius\Bundle\CoreBundle\Model\User as BaseUser;

class User extends BaseUser
{
  protected $mobile;

  /**
   * {@inheritdoc}
   */
  public function setMobile($mobile)
  {
    $this->mobile = $mobile;
  }
  /**
   * {@inheritdoc}
   */
  public function getMobile()
  {
    return $this->mobile;
  }
}

在文件src/Sylius/Bundle/ShopBundle/Resources/config/doctrine/model/user.orm.xml,我有:

<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xmlns:gedmo="http://gediminasm.org/schemas/orm/doctrine-extensions-mapping"
                  xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
                                      http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">

    <mapped-superclass name="Sylius\Bundle\ShopBundle\Model\User" table="sylius_user">

        <field name="mobile" column="mobile" type="string" nullable="true" />

    </mapped-superclass>

</doctrine-mapping>

在文件src/Sylius/Bundle/ShopBundle/SyliusShopBundle.php 中,我有:

 class SyliusShopBundle extends Bundle
{
    /**
     * Return array with currently supported drivers.
     *
     * @return array
     */
    public static function getSupportedDrivers()
    {
        return array(
            SyliusResourceBundle::DRIVER_DOCTRINE_ORM
        );
    }
}

我在 app/AppKernel.php 中添加了这一行

new Sylius\Bundle\ShopBundle\SyliusShopBundle(),

最后,我很喜欢:

php app/console doctrine:schema:update --dump-sql

我在数据库中没有要更新的内容。

我错过了哪一部分?我该怎么做才能使它起作用?谢谢!!


我在 DependencyInjection 文件夹中添加了两个文件

配置.php

class Configuration implements ConfigurationInterface
{
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('sylius_shop');

        $rootNode
            ->addDefaultsIfNotSet()
            ->children()
                ->scalarNode('driver')->cannotBeOverwritten()->isRequired()->cannotBeEmpty()->end()
            ->end()
        ;

        $this->addClassesSection($rootNode);

        return $treeBuilder;
    }

    /**
     * Adds `classes` section.
     *
     * @param ArrayNodeDefinition $node
     */
    private function addClassesSection(ArrayNodeDefinition $node)
    {
        $node
            ->children()
                ->arrayNode('classes')
                    ->addDefaultsIfNotSet()
                    ->children()
                        ->arrayNode('user')
                            ->addDefaultsIfNotSet()
                            ->children()
                                ->scalarNode('model')->defaultValue('Sylius\\Bundle\\ShopBundle\\Model\\User')->end()
                            ->end()
                        ->end()
                    ->end()
                ->end()
            ->end()
        ;
    }
}

SyliusShopExtension.php

<?php

namespace Sylius\Bundle\ShopBundle\DependencyInjection;

use Sylius\Bundle\ResourceBundle\DependencyInjection\SyliusResourceExtension;
use Symfony\Component\DependencyInjection\ContainerBuilder;


class SyliusShopExtension extends SyliusResourceExtension
{
    /**
     * @var array
     */
    private $bundles = array();

    /**
     * {@inheritdoc}
     */
    public function load(array $config, ContainerBuilder $container)
    {
        $this->configDir = __DIR__.'/../Resources/config';

        $this->configure($config, new Configuration(), $container, self::CONFIGURE_LOADER | self::CONFIGURE_DATABASE | self::CONFIGURE_PARAMETERS);
    }


}

【问题讨论】:

    标签: symfony sylius


    【解决方案1】:
    1. 应该是User.orm.xml,而不是user.orm.xml
    2. 你必须在sylius_core -&gt; classes -&gt; user -&gt; model节点下配置类。
    3. 您不应该通过 Sylius 捆绑包来激发您的捆绑包,并且绝对不要放在“Sylius”命名空间下。只需创建一个非常基本的 Symfony 包并将您的用户实体放在 Entity 命名空间下,Symfony 不会在 Model 下看到它。

    【讨论】:

    • 在第二点之后,我遇到了另一个错误:Doctrine\Common\Persistence\Mapping\MappingException: The class 'Sylius\Bundle\ShopBundle\Model\User' was not found in the chain configured namespaces FOS\UserBundle\Entity, Sylius\Bundle\OrderBundle\Model, Sylius\Bundle\MoneyBunle\Model, Sylius\Bundle\settingbundle\model ......................。这是覆盖 Model User 的正确方法吗?也许我应该用 SyliusBundle 创建我自己的包。像“Acme\Bundle\ShopBundle”?非常感谢您的帮助。
    • 我更新了我的答案。请尽可能使用最简单的捆绑包,不要复制 Sylius 的东西,因为它对您的用例来说太复杂了。
    【解决方案2】:

    我要补充一点,要使用 Sylius 固定装置,您也必须配置用户资源:

    sylius_resource:
      resources:
        sylius.user:
          classes:
            model: MyBundle\UserBundle\Entity\User
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 2017-08-23
      • 1970-01-01
      相关资源
      最近更新 更多