我无法正确使用 Doctrine 存储库
I cannot correctly use Doctrine repository
好的,我知道这个标题可能太笼统了,但我会尽量在这里描述得更好。
我正在学习 Symfony(完全是 Symfony 的菜鸟),我正在尝试使我的第一个 POST 端点具有存储值到数据库。目前一切正常,除了将数据持久化到数据库。
我创建了实体账户。
/**
* @ORM\Entity(repositoryClass="App\Account\Infrastructure\Repository\Doctrine\DoctrineAccountRepository")
* @ORM\Table(name="accounts", indexes={@ORM\Index(name="accounts_id", columns={"id"})})
*/
class Account
{
use UniqueIdentifierTrait;
/**
* @var \App\Account\Infrastructure\Entity\Doctrine\Email
* @ORM\OneToOne(targetEntity="App\Account\Infrastructure\Entity\Doctrine\Email", cascade={"persist"})
* @ORM\JoinColumn(referencedColumnName="id", nullable=false, unique=true, onDelete="CASCADE")
*/
private Email $email;
/**
* @var \App\Account\Infrastructure\Entity\Doctrine\Credentials
* @ORM\OneToOne(targetEntity="App\Account\Infrastructure\Entity\Doctrine\Credentials", cascade={"persist"})
* @ORM\JoinColumn(referencedColumnName="id", nullable=false, unique=true, onDelete="CASCADE")
*/
private Credentials $credentials;
/**
* @param \App\Account\Core\ValueObject\Uuid $id
* @param \App\Account\Infrastructure\Entity\Doctrine\Email $email
* @param \App\Account\Infrastructure\Entity\Doctrine\Credentials $credentials
*/
public function __construct(Uuid $id, Email $email, Credentials $credentials)
{
$this->id = $id;
$this->email = $email;
$this->credentials = $credentials;
}
}
我也有它的存储库
class DoctrineAccountRepository extends ServiceEntityRepository
{
/**
* @param \App\Account\Infrastructure\Entity\Doctrine\Account $account
* @return void
* @throws \App\Internal\Infrastructure\Exception\SaveException
*/
public function save(Account $account): void
{
try {
$this->getEntityManager()->persist($account);
$this->getEntityManager()->flush();
} catch (ORMException $e) {
throw new SaveException($e->getMessage());
}
}
}
我有服务配置:
services:
_defaults:
autowire: true
autoconfigure: true
App\Account\Infrastructure\Repository\Doctrine\DoctrineAccountRepository:
arguments:
- '@Doctrine\Common\Persistence\ManagerRegistry'
- App\Account\Infrastructure\Entity\Doctrine\Account
我认为我绑定正确,但由于在 Postman 中发送请求,我得到
PDOException: could not find driver.
由于 $em->flush()
;
抛出异常
这对我来说很奇怪,因为我的迁移已成功执行,因此应用程序与数据库建立了连接。
学说配置
doctrine:
dbal:
driver: '%env(resolve:DATABASE_DRIVER)%' # <-- pdo_sqlsrv
host: '%env(resolve:DATABASE_HOST)%'
port: '%env(resolve:DATABASE_PORT)%'
user: '%env(resolve:DATABASE_USER)%'
password: '%env(resolve:DATABASE_PASSWORD)%'
dbname: '%env(resolve:DATABASE_NAME)%'
charset: '%env(resolve:DATABASE_CHARSET)%'
``
迁移通常 运行 来自命令行,而 Web 请求 运行 通过 php-fpm 或一些 cgi 模块,两者可能有非常不同的 php.ini他们加载的文件,因此允许 php cli 由于加载的驱动程序而工作得很好,而服务器请求由于缺少驱动程序而失败的情况。修复显然是在相关 php ini 文件中启用驱动程序。
phpinfo()
(显然在 php 中)会在顶部某处提及加载的 ini 文件。例如在我的服务器上输出可能是 (request):
而 cli 输出:
好的,我知道这个标题可能太笼统了,但我会尽量在这里描述得更好。
我正在学习 Symfony(完全是 Symfony 的菜鸟),我正在尝试使我的第一个 POST 端点具有存储值到数据库。目前一切正常,除了将数据持久化到数据库。
我创建了实体账户。
/**
* @ORM\Entity(repositoryClass="App\Account\Infrastructure\Repository\Doctrine\DoctrineAccountRepository")
* @ORM\Table(name="accounts", indexes={@ORM\Index(name="accounts_id", columns={"id"})})
*/
class Account
{
use UniqueIdentifierTrait;
/**
* @var \App\Account\Infrastructure\Entity\Doctrine\Email
* @ORM\OneToOne(targetEntity="App\Account\Infrastructure\Entity\Doctrine\Email", cascade={"persist"})
* @ORM\JoinColumn(referencedColumnName="id", nullable=false, unique=true, onDelete="CASCADE")
*/
private Email $email;
/**
* @var \App\Account\Infrastructure\Entity\Doctrine\Credentials
* @ORM\OneToOne(targetEntity="App\Account\Infrastructure\Entity\Doctrine\Credentials", cascade={"persist"})
* @ORM\JoinColumn(referencedColumnName="id", nullable=false, unique=true, onDelete="CASCADE")
*/
private Credentials $credentials;
/**
* @param \App\Account\Core\ValueObject\Uuid $id
* @param \App\Account\Infrastructure\Entity\Doctrine\Email $email
* @param \App\Account\Infrastructure\Entity\Doctrine\Credentials $credentials
*/
public function __construct(Uuid $id, Email $email, Credentials $credentials)
{
$this->id = $id;
$this->email = $email;
$this->credentials = $credentials;
}
}
我也有它的存储库
class DoctrineAccountRepository extends ServiceEntityRepository
{
/**
* @param \App\Account\Infrastructure\Entity\Doctrine\Account $account
* @return void
* @throws \App\Internal\Infrastructure\Exception\SaveException
*/
public function save(Account $account): void
{
try {
$this->getEntityManager()->persist($account);
$this->getEntityManager()->flush();
} catch (ORMException $e) {
throw new SaveException($e->getMessage());
}
}
}
我有服务配置:
services:
_defaults:
autowire: true
autoconfigure: true
App\Account\Infrastructure\Repository\Doctrine\DoctrineAccountRepository:
arguments:
- '@Doctrine\Common\Persistence\ManagerRegistry'
- App\Account\Infrastructure\Entity\Doctrine\Account
我认为我绑定正确,但由于在 Postman 中发送请求,我得到
PDOException: could not find driver.
由于 $em->flush()
;
这对我来说很奇怪,因为我的迁移已成功执行,因此应用程序与数据库建立了连接。
学说配置
doctrine:
dbal:
driver: '%env(resolve:DATABASE_DRIVER)%' # <-- pdo_sqlsrv
host: '%env(resolve:DATABASE_HOST)%'
port: '%env(resolve:DATABASE_PORT)%'
user: '%env(resolve:DATABASE_USER)%'
password: '%env(resolve:DATABASE_PASSWORD)%'
dbname: '%env(resolve:DATABASE_NAME)%'
charset: '%env(resolve:DATABASE_CHARSET)%'
``
迁移通常 运行 来自命令行,而 Web 请求 运行 通过 php-fpm 或一些 cgi 模块,两者可能有非常不同的 php.ini他们加载的文件,因此允许 php cli 由于加载的驱动程序而工作得很好,而服务器请求由于缺少驱动程序而失败的情况。修复显然是在相关 php ini 文件中启用驱动程序。
phpinfo()
(显然在 php 中)会在顶部某处提及加载的 ini 文件。例如在我的服务器上输出可能是 (request):
而 cli 输出: