实现 TranslationInterface 时找不到映射文件
No mapping file found when implementing TranslationInterface
我正在使用 Ez-Extends 扩展 Sonata Classification Bundle 的类别实体。
现在我想使用 Knp\DoctrineBehaviors\Model\Translatable\TranslatableTrait
使我的类别可翻译。我在我的类别 class 中应用了特征,并让它实现了 TranslatableInterface。然后我创建一个新的 CategoryTranslation class:
<?php
namespace App\Application\Sonata\ClassificationBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Contract\Entity\TranslationInterface;
use Knp\DoctrineBehaviors\Model\Translatable\TranslationTrait;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* @ORM\Entity
*/
class CategoryTranslation implements TranslationInterface
{
use TranslationTrait;
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
*/
private $id;
/**
* @var string | null
* @ORM\Column(type="string")
* @Groups("filter")
*/
private $name;
private $trans;
/**
* @return mixed
*/
public function getId()
{
return $this->id;
}
/**
* @param mixed $id
* @return CategoryTranslation
*/
public function setId($id)
{
$this->id = $id;
return $this;
}
/**
* @return string|null
*/
public function getName(): ?string
{
return $this->name;
}
/**
* @param string|null $name
* @return CategoryTranslation
*/
public function setName(?string $name): CategoryTranslation
{
$this->name = $name;
return $this;
}
/**
* @return mixed
*/
public function getTrans()
{
return $this->trans;
}
/**
* @param mixed $trans
* @return CategoryTranslation
*/
public function setTrans($trans)
{
$this->trans = $trans;
return $this;
}
}
但是,当我尝试在应用程序中执行任何操作时,我现在收到此消息:
In MappingException.php line 65:
No mapping file found named 'CategoryTranslation.orm.xml' for class 'App\Application\Sonata\ClassificationBundle\E
ntity\CategoryTranslation'.
据我所知,这个新实体应该是使用注解进行映射,而不是XML。我做错了什么?
编辑:这是我的 doctrine.yaml 文件的内容:
parameters:
# Adds a fallback DATABASE_URL if the env var is not set.
# This allows you to run cache:warmup even if your
# environment variables are not available yet.
# You should not need to change this value.
env(DATABASE_URL): ''
doctrine:
dbal:
# configure these for your database server
driver: 'pdo_mysql'
server_version: '5.6'
charset: utf8
# With Symfony 3.3, remove the `resolve:` prefix
url: '%env(resolve:DATABASE_URL)%'
types:
json: Sonata\Doctrine\Types\JsonType
orm:
auto_generate_proxy_classes: '%kernel.debug%'
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
mappings:
App:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity'
prefix: 'App\Entity'
alias: App
SonataMediaBundle: ~
ApplicationSonataMediaBundle: ~
metadata_cache_driver: array
result_cache_driver: array
query_cache_driver: array
我猜实体的奏鸣曲映射配置是xml。
通过在您的目录 App\Application\Sonata\ClassificationBundle\Entity\CategoryTranslation
中创建一个新的奏鸣曲实体,它将使用您的 doctrine.yaml
:
中定义的映射配置
SonataMediaBundle: ~
ApplicationSonataMediaBundle: ~
其中使用默认的 (xml)。只有您的 App 映射中的映射(即在您的目录 dir: '%kernel.project_dir%/src/Entity'
中)才会使用您指定的注释。
您可以为您的奏鸣曲包指定 type: annotation
(但它可能会使包中的现有实体失败,因此不推荐,但要测试)或为此特定生成 xml 映射文件实体。
我正在使用 Ez-Extends 扩展 Sonata Classification Bundle 的类别实体。
现在我想使用 Knp\DoctrineBehaviors\Model\Translatable\TranslatableTrait
使我的类别可翻译。我在我的类别 class 中应用了特征,并让它实现了 TranslatableInterface。然后我创建一个新的 CategoryTranslation class:
<?php
namespace App\Application\Sonata\ClassificationBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Contract\Entity\TranslationInterface;
use Knp\DoctrineBehaviors\Model\Translatable\TranslationTrait;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* @ORM\Entity
*/
class CategoryTranslation implements TranslationInterface
{
use TranslationTrait;
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
*/
private $id;
/**
* @var string | null
* @ORM\Column(type="string")
* @Groups("filter")
*/
private $name;
private $trans;
/**
* @return mixed
*/
public function getId()
{
return $this->id;
}
/**
* @param mixed $id
* @return CategoryTranslation
*/
public function setId($id)
{
$this->id = $id;
return $this;
}
/**
* @return string|null
*/
public function getName(): ?string
{
return $this->name;
}
/**
* @param string|null $name
* @return CategoryTranslation
*/
public function setName(?string $name): CategoryTranslation
{
$this->name = $name;
return $this;
}
/**
* @return mixed
*/
public function getTrans()
{
return $this->trans;
}
/**
* @param mixed $trans
* @return CategoryTranslation
*/
public function setTrans($trans)
{
$this->trans = $trans;
return $this;
}
}
但是,当我尝试在应用程序中执行任何操作时,我现在收到此消息:
In MappingException.php line 65:
No mapping file found named 'CategoryTranslation.orm.xml' for class 'App\Application\Sonata\ClassificationBundle\E
ntity\CategoryTranslation'.
据我所知,这个新实体应该是使用注解进行映射,而不是XML。我做错了什么?
编辑:这是我的 doctrine.yaml 文件的内容:
parameters:
# Adds a fallback DATABASE_URL if the env var is not set.
# This allows you to run cache:warmup even if your
# environment variables are not available yet.
# You should not need to change this value.
env(DATABASE_URL): ''
doctrine:
dbal:
# configure these for your database server
driver: 'pdo_mysql'
server_version: '5.6'
charset: utf8
# With Symfony 3.3, remove the `resolve:` prefix
url: '%env(resolve:DATABASE_URL)%'
types:
json: Sonata\Doctrine\Types\JsonType
orm:
auto_generate_proxy_classes: '%kernel.debug%'
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
mappings:
App:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity'
prefix: 'App\Entity'
alias: App
SonataMediaBundle: ~
ApplicationSonataMediaBundle: ~
metadata_cache_driver: array
result_cache_driver: array
query_cache_driver: array
我猜实体的奏鸣曲映射配置是xml。
通过在您的目录 App\Application\Sonata\ClassificationBundle\Entity\CategoryTranslation
中创建一个新的奏鸣曲实体,它将使用您的 doctrine.yaml
:
SonataMediaBundle: ~
ApplicationSonataMediaBundle: ~
其中使用默认的 (xml)。只有您的 App 映射中的映射(即在您的目录 dir: '%kernel.project_dir%/src/Entity'
中)才会使用您指定的注释。
您可以为您的奏鸣曲包指定 type: annotation
(但它可能会使包中的现有实体失败,因此不推荐,但要测试)或为此特定生成 xml 映射文件实体。