doctrine-orm - Zend 框架 3 - 找不到教义实体
问题描述
目的是创建一个模块,在其中插入所有实体,然后在其他模块中使用它们。这就是为什么我创建了一个名为 Entity 的模块,我在其中输入了实体。不幸的是,当我尝试在基本控制器中使用这些实体之一时,出现错误:找不到类
这是我的作曲家
"autoload": {
"psr-4": {
"Application\\": "module/Application/src/",
"Entity\\": "module/Entity/src/"
}
},
我已经执行了这个命令
composer dump-autoload
我的实体类在
module/Entity/src/Model/
这是我的课
<?php
namespace Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* SysUserRole
*
* @ORM\Table(name="sys_user_role")
* @ORM\Entity
*/
class SysUserRole
{
/**
* @var int
*
* @ORM\Column(name="ID_SYS_USER_ROLE", type="integer", nullable=false, options={"unsigned"=true})
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $idSysUserRole;
/**
* @var string
*
* @ORM\Column(name="NAME", type="string", length=100, nullable=false)
*/
private $name;
/**
* @var string
*
* @ORM\Column(name="DESCRIPTION", type="string", length=255, nullable=false)
*/
private $description;
/**
* @return int
*/
public function getIdSysUserRole()
{
return $this->idSysUserRole;
}
/**
* @param int $idSysUserRole
*/
public function setIdSysUserRole($idSysUserRole)
{
$this->idSysUserRole = $idSysUserRole;
}
/**
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* @param string $name
*/
public function setName($name)
{
$this->name = $name;
}
/**
* @return string
*/
public function getDescription()
{
return $this->description;
}
/**
* @param string $description
*/
public function setDescription($description)
{
$this->description = $description;
}
}
这是我的 config\autoload\doctrine.global.php
'doctrine' => [
'connection' => [
'orm_default' => [
'driverClass' => PDOMySqlDriver::class,
'params' => [
'host' => 'localhost',
'user' => '***',
'password' => '****',
'dbname' => 'mydb',
'charset' => 'utf8',
'driverOptions' => array(
1002 => 'SET NAMES utf8'
)
]
],
],
'authentication' => [
'orm_default' => [
'object_manager' => 'Doctrine\ORM\EntityManager',
'identity_class' => 'Application\Entity\User',
'identity_property' => 'email',
'credential_property' => 'password',
],
],
'driver' => [
'entity_driver' => [
'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => [__DIR__ . '/../../module/Entity/src/Model/']
],
'orm_default' => [
'drivers' => [
'\Entity' => 'entity_driver'
]
]
],
],
在控制器动作中我试试这个
$entity = new SysUserRole();
错误是
Class 'Entity\SysUserRole' not found
编辑:
错误已更改
我将此代码移动到 module.config.php 中
'doctrine' => [
'driver' => [
__NAMESPACE__ . '_driver' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => array(__DIR__ . '/../src/Model')
),
'orm_default' => [
'drivers' => [
//was \Entity
'Entity\Model' => __NAMESPACE__ . '_driver'
]
]
],
]
新错误是
The class 'Entity\Model\SysUserRole' was not found in the chain configured namespaces \Entity\
解决方案
文件夹结构和 psr-4 注册的命名空间。我希望实体名称空间Entity\Model
与类名一起使用。
顺便说一句,出于某种目的使用模块可能是一种更好的方法。为了模块的目的,每个模块都有实体(例如,用户模块中的用户和配置文件实体对象)是有意义的。
namespace SomeSpace
use Doctrine\ORM\Mapping\Driver\AnnotationDriver;
return [
'doctrine' => [
'driver' => [
__NAMESPACE__ . '_driver' => [
'class' => AnnotationDriver::class,
'cache' => 'array',
'paths' => [
__DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'src'
. DIRECTORY_SEPARATOR . 'Entity',
]
],
'orm_default' => [
'drivers' => [
__NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
],
],
],
],
];
由于使用了__NAMESPACE__
和__DIR__
全局常量,每个模块都需要上述配置。
注意:确保命名空间名称与文件夹名称匹配,例如:
module\Address\Entity\Address
(最后是类名Address.php
)
这里的文件夹结构是:
module\Address\Entity\**.php
示例:实体类和关联的composer.json
从示例链接:
作曲家.json
"autoload": {
"psr-4": {
"Keet\\Form\\Examples\\": "src/"
},
地址.php
<?php
namespace Keet\Form\Examples\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(name="addresses")
* @ORM\Entity
*/
class Address extends AbstractEntity
{
...
}
推荐阅读
- react-native - 如何在渲染前修改数组
- error-handling - 无法处理 django-rest-framework 上的响应错误
- python - 使用 BeautifulSoup 从文本文件中获取 URL
- mysql - 为什么仅在强制而不是默认情况下才使用索引?
- excel - VBA 不复制整行,缺少一列
- assembly - 我们如何判断堆栈帧当前是空的?
- vue.js - 如何从 window.open() 函数链接到 vue 的构建文件夹(dist)?
- python - 关于在 Python 上检查字符类型的问题
- algorithm - 如何在列表中加入具有相同值的字符串列表
- python - 我想使用另一个 python 文件上的代码在一个单独的文件上创建赛车手的时间列表