Class 'doctrine.orm.validator.unique' 未找到
Class 'doctrine.orm.validator.unique' not found
所以我不确定这里的问题是什么,或者这个 class 是如何加载的。但我的模型(或他们实际称为实体)看起来像这样:
<?php
namespace ImageUploader\Models;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @ORM\Entity
* @ORM\Table(name="users")
* @UniqueEntity(fields="userName")
* @UniqueEntity(fields="email")
*/
class User {
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue
*/
protected $id;
/**
* @ORM\Column(type="string", length=32, nullable=false)
* @Assert\NotBlank()
*/
protected $firstName;
/**
* @ORM\Column(type="string", length=32, nullable=false)
* @Assert\NotBlank()
*/
protected $lastName;
/**
* @ORM\Column(type="string", length=100, unique=true, nullable=false)
* @Assert\NotBlank(
* message = "Username cannot be blank"
* )
*/
protected $userName;
/**
* @ORM\Column(type="string", length=100, unique=true, nullable=false)
* @Assert\NotBlank()
* @Assert\Email(
* message = "The email you entered is invalid.",
* checkMX = true
* )
*/
protected $email;
/**
* @ORM\Column(type="string", length=500, nullable=false)
* @Assert\NotBlank(
* message = "The password field cannot be empty."
* )
*/
protected $password;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
protected $created_at;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
protected $updated_at;
}
我有一个名为 createAction
的操作,当用户尝试注册时会调用该操作。它看起来像这样:
public static function createAction($params){
$postParams = $params->request()->post();
if ($postParams['password'] !== $postParams['repassword']) {
$flash = new Flash();
$flash->createFlash('error', 'Your passwords do not match.');
$params->redirect('/signup/error');
}
$user = new User();
$user->setFirstName($postParams['firstname'])
->setLastName($postParams['lastname'])
->setUserName($postParams['username'])
->setEmail($postParams['email'])
->setPassword($postParams['password'])
->setCreatedAtTimeStamp();
$validator = Validator::createValidatorBuilder();
$validator->enableAnnotationMapping();
$errors = $validator->getValidator()->validate($user);
var_dump($errors);
}
调用此操作时出现以下错误:
Fatal error: Class 'doctrine.orm.validator.unique' not found in /var/www/html/image_upload_app/vendor/symfony/validator/ConstraintValidatorFactory.php on line 47
我不确定如何解决这个问题。我的作曲家文件是这样的:
{
"require": {
"doctrine/orm": "2.4.*",
"doctrine/migrations": "1.0.*@dev",
"symfony/validator": "2.8.*@dev",
"symfony/doctrine-bridge": "2.8.*@dev",
"slim/slim": "~2.6",
"freya/freya-exception": "0.0.7",
"freya/freya-loader": "0.2.2",
"freya/freya-templates": "0.1.2",
"freya/freya-factory": "0.0.8",
"freya/freya-flash": "0.0.1"
},
"autoload": {
"psr-4": {"": ""}
}
}
所以我不确定我是否丢失了一个包裹或者我做错了什么....
我的 bootstrap.php
文件中包含以下内容:
require_once 'vendor/autoload.php';
$loader = require 'vendor/autoload.php';
\Doctrine\Common\Annotations\AnnotationRegistry::registerLoader(array($loader, 'loadClass'));
use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;
/**
* Set up Doctrine.
*/
class DoctrineSetup {
/**
* @var array $paths - where the entities live.
*/
protected $paths = array(APP_MODELS);
/**
* @var bool $isDevMode - Are we considered "in development."
*/
protected $isDevMode = false;
/**
* @var array $dbParams - The database paramters.
*/
protected $dbParams = null;
/**
* Constructor to set some core values.
*/
public function __construct(){
if (!file_exists('db_config.ini')) {
throw new \Exception(
'Missing db_config.ini. You can create this from the db_config_sample.ini'
);
}
$this->dbParams = array(
'driver' => 'pdo_mysql',
'user' => parse_ini_file('db_config.ini')['DB_USER'],
'password' => parse_ini_file('db_config.ini')['DB_PASSWORD'],
'dbname' => parse_ini_file('db_config.ini')['DB_NAME']
);
}
/**
* Get the entity manager for use through out the app.
*
* @return EntityManager
*/
public function getEntityManager() {
$config = Setup::createAnnotationMetadataConfiguration($this->paths, $this->isDevMode, null, null, false);
return EntityManager::create($this->dbParams, $config);
}
}
/**
* Function that can be called through out the app.
*
* @return EntityManager
*/
function getEntityManager() {
$ds = new DoctrineSetup();
return $ds->getEntityManager();
}
/**
* Function that returns the conection to the database.
*/
function getConnection() {
$ds = new DoctrineSetup();
return $ds->getEntityManager()->getConnection();
}
我是否需要向其中添加其他内容才能消除此错误?
更新 1
所以我继续设置 AppKernel
,因为我以前没有,而且我认为我不需要 config.yml
(至少现在不需要)。一切似乎都在运行 - 内核方面,但错误仍然存在。
namespace ImageUploader;
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;
class AppKernel extends Kernel {
public function registerBundles() {
$bundles = array(
new \Doctrine\Bundle\DoctrineBundle\DoctrineBundle()
);
return $bundles;
}
public function registerContainerConfiguration(LoaderInterface $loader) {}
}
然后我在 bootstrap 文件中启动内核,添加:
use \ImageUploader\AppKernel;
$kernel = new AppKernel();
$kernel->boot();
据我所读,一切都是正确的 - 除了丢失的配置文件,这应该不是问题。但我仍然收到有问题的错误
您缺少 Doctrine 包,它将 Doctrine 集成到 Symfony 框架中。使用 composer require doctrine/doctrine-bundle
安装它,然后在您的 AppKernel
.
中注册它
与更新 #1 有关
您还需要进行一些配置并设置 Doctrine ORM。如果没有此配置,则不会加载 ORM 服务(如此处缺少的服务)。
这是一个老问题,但由于我偶然发现了它并发现所选答案并不完全令人满意,所以我想贡献一点。
正如我从评论中了解到的,这与全栈 Symfony 无关,而仅与 Symfony-validator 组件有关。
因为验证器约束 UniqueEntity 是基于 Doctrine 集成和硬编码 class 名称,所以不推荐使用这样的方法来防止紧耦合,Symfony 使用了一种被广泛使用的模式,称为服务(see service container)。
这允许通过配置定义服务,然后防止将 class 名称(及其依赖项!)硬编码到验证程序代码库中。这允许两个项目之间的依赖关系是可配置的(更少的兼容性中断)和可选的。
正在搜索的'doctrine.orm.validator.unique' "class"实际上只是对实际class实例的引用。要找到它,必须添加两件事:
- 一个服务容器,它将此服务名称解析为 class 实例
- 以及此服务的实际配置,它定义了要实例化的 class 及其构造函数参数(依赖项)。
查看您的 composer.json 我认为我们需要 Symfony DependencyInjection component,我认为您不需要 AppKernel。以下代码可能有效(未测试)但无论如何应该让您大致了解我们需要什么:
use Symfony\Component\DependencyInjection\ContainerBuilder;
$container = new ContainerBuilder();
$container
->register('doctrine.orm.validator.unique', 'Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntityValidator')
->addArgument(new Reference('doctrine'));
# register doctrine here in the same way as we just registered the validator
所以总而言之,这个答案对于 OP 来说可能晚了一两年,但可能对其他偶然发现这个问题的人有用。干杯!
我是如何解决这个问题的:
首先,创建一个允许我添加验证器的自定义 ConstraintValidatorFactory
<?php
namespace My\App\Validator;
use Symfony\Component\Validator\ConstraintValidatorFactory as SymfonyConstraintValidatorFactory;
use Symfony\Component\Validator\ConstraintValidatorInterface;
/**
* Class ConstraintValidatorFactory
*
* @package My\App\Validator
*/
class ConstraintValidatorFactory extends SymfonyConstraintValidatorFactory
{
/**
* @param string $className
* @param ConstraintValidatorInterface $validator
*
* @return void
*/
public function addValidator($className, $validator): void
{
$this->validators[$className] = $validator;
}
}
那么我可以这样做:
<?php
use My\App\Validator\ConstraintValidatorFactory;
use Symfony\Component\Validator\Validation;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntityValidator;
$factory = new ConstraintValidatorFactory();
$factory->addValidator('doctrine.orm.validator.unique', new UniqueEntityValidator($registry));
$builder = Validation::createValidatorBuilder();
$builder->setConstraintValidatorFactory($factory);
$builder->enableAnnotationMapping();
$validator = $builder->getValidator();
$violations = $validator->validate($entity);
这对我有用,使用 symfony 组件和 zend 服务管理器。
请记住,Symfony 的 UniqueEntityValidator 依赖于 \Doctrine\Common\Persistence\ManagerRegistry
。
我为我的项目使用了一个 EntityManager,并且必须将它包装在一个 ManagerRegistry class 中以使其工作。
在第一个你可以得到内核
使用内核获取服务验证器后。
例如:$validator = $kernel->getContainer()->get('validator');
所以我不确定这里的问题是什么,或者这个 class 是如何加载的。但我的模型(或他们实际称为实体)看起来像这样:
<?php
namespace ImageUploader\Models;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @ORM\Entity
* @ORM\Table(name="users")
* @UniqueEntity(fields="userName")
* @UniqueEntity(fields="email")
*/
class User {
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue
*/
protected $id;
/**
* @ORM\Column(type="string", length=32, nullable=false)
* @Assert\NotBlank()
*/
protected $firstName;
/**
* @ORM\Column(type="string", length=32, nullable=false)
* @Assert\NotBlank()
*/
protected $lastName;
/**
* @ORM\Column(type="string", length=100, unique=true, nullable=false)
* @Assert\NotBlank(
* message = "Username cannot be blank"
* )
*/
protected $userName;
/**
* @ORM\Column(type="string", length=100, unique=true, nullable=false)
* @Assert\NotBlank()
* @Assert\Email(
* message = "The email you entered is invalid.",
* checkMX = true
* )
*/
protected $email;
/**
* @ORM\Column(type="string", length=500, nullable=false)
* @Assert\NotBlank(
* message = "The password field cannot be empty."
* )
*/
protected $password;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
protected $created_at;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
protected $updated_at;
}
我有一个名为 createAction
的操作,当用户尝试注册时会调用该操作。它看起来像这样:
public static function createAction($params){
$postParams = $params->request()->post();
if ($postParams['password'] !== $postParams['repassword']) {
$flash = new Flash();
$flash->createFlash('error', 'Your passwords do not match.');
$params->redirect('/signup/error');
}
$user = new User();
$user->setFirstName($postParams['firstname'])
->setLastName($postParams['lastname'])
->setUserName($postParams['username'])
->setEmail($postParams['email'])
->setPassword($postParams['password'])
->setCreatedAtTimeStamp();
$validator = Validator::createValidatorBuilder();
$validator->enableAnnotationMapping();
$errors = $validator->getValidator()->validate($user);
var_dump($errors);
}
调用此操作时出现以下错误:
Fatal error: Class 'doctrine.orm.validator.unique' not found in /var/www/html/image_upload_app/vendor/symfony/validator/ConstraintValidatorFactory.php on line 47
我不确定如何解决这个问题。我的作曲家文件是这样的:
{
"require": {
"doctrine/orm": "2.4.*",
"doctrine/migrations": "1.0.*@dev",
"symfony/validator": "2.8.*@dev",
"symfony/doctrine-bridge": "2.8.*@dev",
"slim/slim": "~2.6",
"freya/freya-exception": "0.0.7",
"freya/freya-loader": "0.2.2",
"freya/freya-templates": "0.1.2",
"freya/freya-factory": "0.0.8",
"freya/freya-flash": "0.0.1"
},
"autoload": {
"psr-4": {"": ""}
}
}
所以我不确定我是否丢失了一个包裹或者我做错了什么....
我的 bootstrap.php
文件中包含以下内容:
require_once 'vendor/autoload.php';
$loader = require 'vendor/autoload.php';
\Doctrine\Common\Annotations\AnnotationRegistry::registerLoader(array($loader, 'loadClass'));
use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;
/**
* Set up Doctrine.
*/
class DoctrineSetup {
/**
* @var array $paths - where the entities live.
*/
protected $paths = array(APP_MODELS);
/**
* @var bool $isDevMode - Are we considered "in development."
*/
protected $isDevMode = false;
/**
* @var array $dbParams - The database paramters.
*/
protected $dbParams = null;
/**
* Constructor to set some core values.
*/
public function __construct(){
if (!file_exists('db_config.ini')) {
throw new \Exception(
'Missing db_config.ini. You can create this from the db_config_sample.ini'
);
}
$this->dbParams = array(
'driver' => 'pdo_mysql',
'user' => parse_ini_file('db_config.ini')['DB_USER'],
'password' => parse_ini_file('db_config.ini')['DB_PASSWORD'],
'dbname' => parse_ini_file('db_config.ini')['DB_NAME']
);
}
/**
* Get the entity manager for use through out the app.
*
* @return EntityManager
*/
public function getEntityManager() {
$config = Setup::createAnnotationMetadataConfiguration($this->paths, $this->isDevMode, null, null, false);
return EntityManager::create($this->dbParams, $config);
}
}
/**
* Function that can be called through out the app.
*
* @return EntityManager
*/
function getEntityManager() {
$ds = new DoctrineSetup();
return $ds->getEntityManager();
}
/**
* Function that returns the conection to the database.
*/
function getConnection() {
$ds = new DoctrineSetup();
return $ds->getEntityManager()->getConnection();
}
我是否需要向其中添加其他内容才能消除此错误?
更新 1
所以我继续设置 AppKernel
,因为我以前没有,而且我认为我不需要 config.yml
(至少现在不需要)。一切似乎都在运行 - 内核方面,但错误仍然存在。
namespace ImageUploader;
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;
class AppKernel extends Kernel {
public function registerBundles() {
$bundles = array(
new \Doctrine\Bundle\DoctrineBundle\DoctrineBundle()
);
return $bundles;
}
public function registerContainerConfiguration(LoaderInterface $loader) {}
}
然后我在 bootstrap 文件中启动内核,添加:
use \ImageUploader\AppKernel;
$kernel = new AppKernel();
$kernel->boot();
据我所读,一切都是正确的 - 除了丢失的配置文件,这应该不是问题。但我仍然收到有问题的错误
您缺少 Doctrine 包,它将 Doctrine 集成到 Symfony 框架中。使用 composer require doctrine/doctrine-bundle
安装它,然后在您的 AppKernel
.
与更新 #1 有关
您还需要进行一些配置并设置 Doctrine ORM。如果没有此配置,则不会加载 ORM 服务(如此处缺少的服务)。
这是一个老问题,但由于我偶然发现了它并发现所选答案并不完全令人满意,所以我想贡献一点。
正如我从评论中了解到的,这与全栈 Symfony 无关,而仅与 Symfony-validator 组件有关。 因为验证器约束 UniqueEntity 是基于 Doctrine 集成和硬编码 class 名称,所以不推荐使用这样的方法来防止紧耦合,Symfony 使用了一种被广泛使用的模式,称为服务(see service container)。
这允许通过配置定义服务,然后防止将 class 名称(及其依赖项!)硬编码到验证程序代码库中。这允许两个项目之间的依赖关系是可配置的(更少的兼容性中断)和可选的。
正在搜索的'doctrine.orm.validator.unique' "class"实际上只是对实际class实例的引用。要找到它,必须添加两件事:
- 一个服务容器,它将此服务名称解析为 class 实例
- 以及此服务的实际配置,它定义了要实例化的 class 及其构造函数参数(依赖项)。
查看您的 composer.json 我认为我们需要 Symfony DependencyInjection component,我认为您不需要 AppKernel。以下代码可能有效(未测试)但无论如何应该让您大致了解我们需要什么:
use Symfony\Component\DependencyInjection\ContainerBuilder;
$container = new ContainerBuilder();
$container
->register('doctrine.orm.validator.unique', 'Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntityValidator')
->addArgument(new Reference('doctrine'));
# register doctrine here in the same way as we just registered the validator
所以总而言之,这个答案对于 OP 来说可能晚了一两年,但可能对其他偶然发现这个问题的人有用。干杯!
我是如何解决这个问题的:
首先,创建一个允许我添加验证器的自定义 ConstraintValidatorFactory
<?php
namespace My\App\Validator;
use Symfony\Component\Validator\ConstraintValidatorFactory as SymfonyConstraintValidatorFactory;
use Symfony\Component\Validator\ConstraintValidatorInterface;
/**
* Class ConstraintValidatorFactory
*
* @package My\App\Validator
*/
class ConstraintValidatorFactory extends SymfonyConstraintValidatorFactory
{
/**
* @param string $className
* @param ConstraintValidatorInterface $validator
*
* @return void
*/
public function addValidator($className, $validator): void
{
$this->validators[$className] = $validator;
}
}
那么我可以这样做:
<?php
use My\App\Validator\ConstraintValidatorFactory;
use Symfony\Component\Validator\Validation;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntityValidator;
$factory = new ConstraintValidatorFactory();
$factory->addValidator('doctrine.orm.validator.unique', new UniqueEntityValidator($registry));
$builder = Validation::createValidatorBuilder();
$builder->setConstraintValidatorFactory($factory);
$builder->enableAnnotationMapping();
$validator = $builder->getValidator();
$violations = $validator->validate($entity);
这对我有用,使用 symfony 组件和 zend 服务管理器。
请记住,Symfony 的 UniqueEntityValidator 依赖于 \Doctrine\Common\Persistence\ManagerRegistry
。
我为我的项目使用了一个 EntityManager,并且必须将它包装在一个 ManagerRegistry class 中以使其工作。
在第一个你可以得到内核 使用内核获取服务验证器后。 例如:$validator = $kernel->getContainer()->get('validator');