当我尝试验证我的symfony架构时,我收到错误:
[Doctrine\Common\Annotations\AnnotationException]
[Semantical Error] The annotation "@Doctrine\Orm\Mapping\Entity" in class C
hill\EmailUser\Entity\EmailUser does not exist, or could not be auto-loaded
我在这个问题中看到:Trouble with importing annotations,据说我们需要改变Doctrine Simple Annotation Reader。即使在自动加载器中进行捆绑配置似乎很奇怪,我尝试通过app / autoloader.php来实现:
use Doctrine\ORM\Configuration;
path = __DIR__."/../vendor/path/to/annotationDriver.php"
Configuration::newDefaultAnnotationDriver(path, false);
我也尝试过研究,看看我是否能找到像这样的参数:
doctrine.orm.mappings.annotations.simple_annotations_reader
我可以设置为假,但我找不到任何东西。
正如您在下面看到的那样,我也尝试过将我的捆绑包的映射添加到config.yml中的ORM设置。
composer.json:
{
"name": "root/photoproject",
"license": "proprietary",
"type": "project",
"autoload": {
"psr-4": {
"": "src/"
},
"classmap": [
"app/AppKernel.php",
"app/AppCache.php"
]
},
"autoload-dev": {
"files": [
"vendor/symfony/symfony/src/Symfony/Component/VarDumper/Resources/functions/dump.php"
]
},
"require": {
"php": ">=5.3.9",
"doctrine/annotations": "^1.4",
"doctrine/doctrine-bundle": "~1.4",
"doctrine/migrations": "^1.5",
"doctrine/orm": "^2.5",
"incenteev/composer-parameter-handler": "~2.0",
"sensio/distribution-bundle": "~4.0",
"sensio/framework-extra-bundle": "^3.0.2",
"symfony/monolog-bundle": "^3.0.2",
"symfony/swiftmailer-bundle": "~2.3,>=2.3.10",
"symfony/symfony": "2.8.*",
"twig/twig": "^1.0||^2.0"
},
"require-dev": {
"sensio/generator-bundle": "~3.0",
"symfony/phpunit-bridge": "~2.7"
},
"scripts": {
"symfony-scripts": [
"Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::prepareDeploymentTarget"
],
"post-install-cmd": [
"@symfony-scripts"
],
"post-update-cmd": [
"@symfony-scripts"
]
},
"config": {
"bin-dir": "bin",
"sort-packages": true
},
"extra": {
"symfony-app-dir": "app",
"symfony-web-dir": "web",
"symfony-assets-install": "relative",
"incenteev-parameters": {
"file": "app/config/parameters.yml"
},
"branch-alias": null
}
}
应用程序/配置/ config.yml
imports:
- { resource: parameters.yml }
- { resource: security.yml }
- { resource: services.yml }
# Put parameters here that don't need to change on each machine where the app is deployed
# http://symfony.com/doc/current/best_practices /configuration.html#application-related-configuration
parameters:
locale: en
framework:
#esi: ~
#translator: { fallbacks: ['%locale%'] }
secret: '%secret%'
router:
resource: '%kernel.root_dir%/config/routing.yml'
strict_requirements: ~
form: ~
csrf_protection: ~
validation: { enable_annotations: true }
serializer: { enable_annotations: true }
templating:
engines: ['twig']
default_locale: '%locale%'
trusted_hosts: ~
trusted_proxies: ~
session:
# handler_id set to null will use default session handler from php.ini
handler_id: ~
fragments: ~
http_method_override: true
# Twig Configuration
twig:
debug: '%kernel.debug%'
strict_variables: '%kernel.debug%'
# Doctrine Configuration
doctrine:
dbal:
driver: pdo_mysql
host: '%database_host%'
port: '%database_port%'
dbname: '%database_name%'
user: '%database_user%'
password: '%database_password%'
charset: UTF8
# if using pdo_sqlite as your database driver:
# 1. add the path in parameters.yml
# e.g. database_path: '%kernel.root_dir%/data/data.db3'
# 2. Uncomment database_path in parameters.yml.dist
# 3. Uncomment next line:
#path: '%database_path%'
orm:
auto_generate_proxy_classes: '%kernel.debug%'
entity_managers:
default:
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
mappings:
ChillEmailUserBundle: ~
# Swiftmailer Configuration
swiftmailer:
transport: '%mailer_transport%'
hostity/l: { type: memory }
的src /冷却/ EmailUserBundle /实体/ EmailUser.php
namespace Chill\EmailUser\Entity;
use Doctrine\Orm\Mapping as ORM;
use Symfony\Component\Validator\Contraints as Assert;
/**
* @ORM\Entity
*/
class EmailUser
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length="1023")
* @Assert\Email(message="Not a valid email")
*/
private $email;
/**
* @ORM\Column(type="string", length="4096")
*/
private $password;
/**
* @ORM\Column(type="string", length="4096")
*/
private $salt;
/**
* @ORM\ManyToMany(targetEntity="Role")
*/
private $roles;
}
所以我的问题是如何才能做出Symfony中接受的答案(同时最好保持捆绑包相对可重复使用)。
谢谢
<?php
use Doctrine\Common\Annotations\AnnotationRegistry;
use Composer\Autoload\ClassLoader;
/** @var ClassLoader $loader */
$loader = require __DIR__.'/../vendor/autoload.php';
AnnotationRegistry::registerLoader(array($loader, 'loadClass'));
return $loader;
答案 0 :(得分:5)
AFAIK您必须为AnnotationRegistry
注册加载程序。
更详细的文档是available here。在symfony项目的情况下,最简单的方法是使用app/autoload
以下内容:
<?php
use Composer\Autoload\ClassLoader;
use Doctrine\Common\Annotations\AnnotationRegistry;
/**
* @var ClassLoader $loader
*/
$loader = require __DIR__.'/../vendor/autoload.php';
AnnotationRegistry::registerLoader(array($loader, 'loadClass'));
return $loader;
由于这种需要,bundle通常使用XML配置容器,路由器等。
如果您更喜欢注释,那么您的私有捆绑包只是注册加载器,如上所示。如果你想公开它,我建议使用xmls for config。