我在尝试将实体放入Sonata Admin Bundle时遇到问题。我有大约5个实体,它们在捆绑包中被精细地列出和查看,但我无法编辑或创建新条目。
当我尝试编辑或创建时,我会得到一个ReflectionException
错误:
类不存在
为了解决这个问题,我尝试在命名空间上操作(将控制器移动到与Admin文件相同的命名空间中,等等),或者调整Admin controller,以便告诉它我的实体("->add('individual','entity',array('class'=>'Platform''ProjectBundle''entity''individual')"而不是->add('individual'))。
我的实体名为Biosample。这是实体文件:
<?php
namespace Platform'ProjectBundle'Entity;
use Doctrine'ORM'Mapping as ORM;
use Doctrine'Common'Collections'ArrayCollection;
/**
* @ORM'Entity
* @ORM'Table(name="biosample")
*/
class Biosample
{
/**
* @ORM'Id
* @ORM'Column(type="integer")
* @ORM'GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM'ManyToOne(targetEntity="Individual", inversedBy="samples")
* @ORM'JoinColumn(name="individual_id", referencedColumnName="id")
*/
protected $individual;
/**
* @ORM'Column(type="string", length=100)
*/
protected $organ;
/**
* @ORM'Column(type="string", length=100)
*/
protected $sample_name;
/**
* @ORM'Column(type="string", nullable=true)
*/
protected $organ_location;
/**
* @ORM'Column(type="string")
*/
protected $tissue_type;
/**
* @ORM'Column(type="string", nullable=true)
*/
protected $tissue_subtype;
/**
* @ORM'Column(type="datetimetz")
*/
protected $sampling_date;
/**
* @ORM'Column(type="decimal", scale=3, nullable=true)
*/
protected $cellularity;
/**
* @ORM'Column(type="string", nullable=true)
*/
protected $conservation;
/**
* @ORM'Column(type="text", nullable=true)
*/
protected $description;
/**
* @ORM'ManyToMany(targetEntity="Project", mappedBy="biosamples")
*/
protected $projects;
public function __construct()
{
$this->projects = new ArrayCollection();
}
public function __toString()
{
return $this->sample_name;
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set organ
*
* @param string $organ
* @return Biosample
*/
public function setOrgan($organ)
{
$this->organ = $organ;
return $this;
}
/**
* Get organ
*
* @return string
*/
public function getOrgan()
{
return $this->organ;
}
/**
* Set organ_location
*
* @param string $organLocation
* @return Biosample
*/
public function setOrganLocation($organLocation)
{
$this->organ_location = $organLocation;
return $this;
}
/**
* Get organ_location
*
* @return string
*/
public function getOrganLocation()
{
return $this->organ_location;
}
/**
* Set tissue_type
*
* @param string $tissueType
* @return Biosample
*/
public function setTissueType($tissueType)
{
$this->tissue_type = $tissueType;
return $this;
}
/**
* Get tissue_type
*
* @return string
*/
public function getTissueType()
{
return $this->tissue_type;
}
/**
* Set tissue_subtype
*
* @param string $tissueSubtype
* @return Biosample
*/
public function setTissueSubtype($tissueSubtype)
{
$this->tissue_subtype = $tissueSubtype;
return $this;
}
/**
* Get tissue_subtype
*
* @return string
*/
public function getTissueSubtype()
{
return $this->tissue_subtype;
}
/**
* Set sampling_date
*
* @param 'DateTime $samplingDate
* @return Biosample
*/
public function setSamplingDate($samplingDate)
{
$this->sampling_date = $samplingDate;
return $this;
}
/**
* Get sampling_date
*
* @return 'DateTime
*/
public function getSamplingDate()
{
return $this->sampling_date;
}
/**
* Set cellularity
*
* @param string $cellularity
* @return Biosample
*/
public function setCellularity($cellularity)
{
$this->cellularity = $cellularity;
return $this;
}
/**
* Get cellularity
*
* @return string
*/
public function getCellularity()
{
return $this->cellularity;
}
/**
* Set conservation
*
* @param string $conservation
* @return Biosample
*/
public function setConservation($conservation)
{
$this->conservation = $conservation;
return $this;
}
/**
* Get conservation
*
* @return string
*/
public function getConservation()
{
return $this->conservation;
}
/**
* Set description
*
* @param string $description
* @return Biosample
*/
public function setDescription($description)
{
$this->description = $description;
return $this;
}
/**
* Get description
*
* @return string
*/
public function getDescription()
{
return $this->description;
}
/**
* Set individual
*
* @param 'Platform'ProjectBundle'Entity'Individual $individual
* @return Biosample
*/
public function setIndividual('Platform'ProjectBundle'Entity'Individual $individual = null)
{
$this->individual = $individual;
return $this;
}
/**
* Get individual
*
* @return 'Platform'ProjectBundle'Entity'Individual
*/
public function getIndividual()
{
return $this->individual;
}
/**
* Add projects
*
* @param 'Platform'ProjectBundle'Entity'Project $projects
* @return Biosample
*/
public function addProject('Platform'ProjectBundle'Entity'Project $projects)
{
$this->projects[] = $projects;
return $this;
}
/**
* Remove projects
*
* @param 'Platform'ProjectBundle'Entity'Project $projects
*/
public function removeProject('Platform'ProjectBundle'Entity'Project $projects)
{
$this->projects->removeElement($projects);
}
/**
* Get projects
*
* @return 'Doctrine'Common'Collections'Collection
*/
public function getProjects()
{
return $this->projects;
}
/**
* Set sample_name
*
* @param string $sampleName
* @return Biosample
*/
public function setSampleName($sampleName)
{
$this->sample_name = $sampleName;
return $this;
}
/**
* Get sample_name
*
* @return string
*/
public function getSampleName()
{
return $this->sample_name;
}
}`
这是我的BiosampleAdmin.php:
<?php
namespace Platform'ProjectBundle'Controller'Admin;
use Sonata'AdminBundle'Admin'Admin;
use Sonata'AdminBundle'Form'FormMapper;
use Sonata'AdminBundle'Datagrid'DatagridMapper;
use Sonata'AdminBundle'Datagrid'ListMapper;
use Sonata'AdminBundle'Show'ShowMapper;
use Knp'Menu'ItemInterface as MenuItemInterface;
use Platform'ProjectBundle'Entity'Biosample;
class BiosampleAdmin extends Admin
{
/**
* @param 'Sonata'AdminBundle'Show'ShowMapper $showMapper
*
* @return void
*/
protected function configureShowFields(ShowMapper $showMapper)
{
$showMapper
->add('id')
->add('sample_name')
->add('individual', 'entity', array('class' => 'Platform'ProjectBundle'Entity'Individual'))
->add('organ')
->add('organ_location')
->add('tissue_type')
->add('tissue_subtype')
->add('sampling_date')
->add('cellularity')
->add('conservation')
->add('projects', 'entity', array('class' => 'Platform'ProjectBundle'Entity'Project'))
->add('description')
;
}
/**
* @param 'Sonata'AdminBundle'Form'FormMapper $formMapper
*
* @return void
*/
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->with('General')
->add('sample_name')
->add('individual')
->add('organ')
->add('organ_location')
->add('tissue_type')
->add('tissue_subtype')
->end()
->with('Miscelaneous')
->add('sampling_date')
->add('cellularity')
->add('conservation')
->end()
->with('Projects')
->add('projects')
->end()
->with('Description')
->add('description', 'sonata_type_model', array('multiple' => false))
->end()
;
}
/**
* @param 'Sonata'AdminBundle'Datagrid'ListMapper $listMapper
*
* @return void
*/
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('id')
->add('sample_name')
->add('individual')
->add('projects')
->add('organ')
->add('tissue')
->add('_action', 'actions', array(
'actions' => array(
'show' => array(),
'edit' => array(),
'delete' => array(),
)
))
;
}
/**
* @param 'Sonata'AdminBundle'Datagrid'DatagridMapper $datagridMapper
*
* @return void
*/
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('sample_name')
->add('individual')
->add('projects')
;
}
}
这是管理员控制器:
<?php
namespace Platform'ProjectBundle'Controller;
use Sonata'AdminBundle'Controller'CRUDController as Controller;
use Platform'ProjectBundle'Entity'Biosample;
class BiosampleAdminController extends Controller
{
}
如果你需要,这里是我的composer.json:
{
"name": "symfony/framework-standard-edition",
"license": "MIT",
"type": "project",
"description": "The '"Symfony Standard Edition'" distribution",
"autoload": {
"psr-0": { "": "src/", "SymfonyStandard": "app/" }
},
"require": {
"php": ">=5.3.3",
"symfony/symfony": "2.6.*",
"doctrine/orm": "~2.2,>=2.2.3,<2.5",
"doctrine/dbal": "<2.5",
"doctrine/doctrine-bundle": "~1.2",
"twig/extensions": "~1.0",
"symfony/assetic-bundle": "~2.3",
"symfony/swiftmailer-bundle": "~2.3",
"symfony/monolog-bundle": "~2.4",
"sensio/distribution-bundle": "~3.0,>=3.0.12",
"sensio/framework-extra-bundle": "~3.0,>=3.0.2",
"jms/security-extra-bundle": "~1.2",
"ircmaxell/password-compat": "~1.0.3",
"stof/doctrine-extensions-bundle": "~1.1@dev",
"friendsofsymfony/user-bundle": "~1.3",
"incenteev/composer-parameter-handler": "~2.0",
"nervo/yuicompressor": "2.4.8",
"sonata-project/admin-bundle": "~2.3",
"sonata-project/doctrine-orm-admin-bundle": "~2.3",
"sonata-project/easy-extends-bundle": "~2.1",
"sonata-project/user-bundle": "~2.2",
"knplabs/knp-menu-bundle": "~1.1",
"mopa/bootstrap-bundle": "~2",
"twbs/bootstrap-sass": "~3.3.0",
"knplabs/knp-paginator-bundle": "dev-master",
"knplabs/knp-menu": "~1.1",
"craue/formflow-bundle": "~2.0"
},
"require-dev": {
"sensio/generator-bundle": "~2.3"
},
"scripts": {
"post-root-package-install": [
"SymfonyStandard''Composer::hookRootPackageInstall"
],
"post-install-cmd": [
"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::removeSymfonyStandardFiles"
],
"post-update-cmd": [
"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::removeSymfonyStandardFiles"
]
},
"config": {
"bin-dir": "bin"
},
"extra": {
"symfony-app-dir": "app",
"symfony-web-dir": "web",
"symfony-assets-install": "relative",
"incenteev-parameters": {
"file": "app/config/parameters.yml"
},
"branch-alias": {
"dev-master": "2.6-dev"
}
}
}
最后,这里是我的服务声明和config.yml文件:Service.yml:
services:
platform.project.admin.biosample:
class: Platform'ProjectBundle'Controller'Admin'BiosampleAdmin
tags:
- { name: sonata.admin, manager_type: orm, group: Project Manager, label: Biosample }
arguments: [null, Platform'ProjectBundle'Entity'Biosample, PlatformProjectBundle:BiosampleAdmin]
Config.yml:
imports:
- { resource: parameters.yml }
- { resource: security.yml }
- { resource: services.yml }
framework:
#esi: ~
translator: { fallbacks: ["%locale%"] }
secret: "%secret%"
router:
resource: "%kernel.root_dir%/config/routing.yml"
strict_requirements: ~
form: ~
csrf_protection: ~
validation: { enable_annotations: true }
templating:
engines: ['twig']
#assets_version: SomeVersionScheme
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%"
# Assetic Configuration
assetic:
debug: "%kernel.debug%"
use_controller: false
bundles: [ ]
#java: /usr/bin/java
filters:
cssrewrite: ~
#closure:
# jar: "%kernel.root_dir%/Resources/java/compiler.jar"
#yui_css:
# jar: "%kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar"
# Doctrine Configuration
doctrine:
dbal:
driver: "%database_driver%"
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%"
types:
json: Sonata'Doctrine'Types'JsonType
orm:
auto_generate_proxy_classes: "%kernel.debug%"
auto_mapping: true
# Swiftmailer Configuration
swiftmailer:
transport: "%mailer_transport%"
host: "%mailer_host%"
username: "%mailer_user%"
password: "%mailer_password%"
spool: { type: memory }
fos_user:
db_driver: orm # other valid values are 'mongodb', 'couchdb' and 'propel'
firewall_name: secured
user_class: Application'Sonata'UserBundle'Entity'User
group:
group_class: Application'Sonata'UserBundle'Entity'Group
group_manager: sonata.user.orm.group_manager
service:
user_manager: sonata.user.orm.user_manager
sonata_doctrine_orm_admin:
entity_manager: ~
sonata_block:
default_contexts: [cms]
blocks:
sonata.admin.block.admin_list:
contexts: [admin]
sonata.user.block.menu: ~
sonata.user.block.account: ~
sonata.block.service.text: ~
sonata_user:
security_acl: true
manager_type: orm
mopa_bootstrap:
form: ~
最后但同样重要的是:完整的堆栈跟踪。
[1] ReflectionException: Class does not exist
at n/a
in /var/www/Project/app/cache/dev/classes.php line 6756
at ReflectionClass->__construct('')
in /var/www/Project/app/cache/dev/classes.php line 6756
at Doctrine'Common'Persistence'AbstractManagerRegistry->getManagerForClass(null)
in /var/www/Project/vendor/sonata-project/doctrine-orm-admin-bundle/Model/ModelManager.php line 220
at Sonata'DoctrineORMAdminBundle'Model'ModelManager->getEntityManager(null)
in /var/www/Project/vendor/sonata-project/doctrine-orm-admin-bundle/Model/ModelManager.php line 54
at Sonata'DoctrineORMAdminBundle'Model'ModelManager->getMetadata(null)
in /var/www/Project/vendor/sonata-project/doctrine-orm-admin-bundle/Model/ModelManager.php line 317
at Sonata'DoctrineORMAdminBundle'Model'ModelManager->getIdentifierFieldNames(null)
in /var/www/Project/app/cache/dev/classes.php line 12663
at Sonata'AdminBundle'Form'ChoiceList'ModelChoiceList->__construct(object(ModelManager), null, null, null, null)
in /var/www/Project/app/cache/dev/classes.php line 13690
at Sonata'AdminBundle'Form'Type'ModelType->Sonata'AdminBundle'Form'Type'{closure}(object(OptionsResolver), object(SimpleChoiceList))
in /var/www/Project/vendor/symfony/symfony/src/Symfony/Component/OptionsResolver/OptionsResolver.php line 836
at Symfony'Component'OptionsResolver'OptionsResolver->offsetGet('choice_list')
in /var/www/Project/vendor/symfony/symfony/src/Symfony/Component/OptionsResolver/OptionsResolver.php line 769
at Symfony'Component'OptionsResolver'OptionsResolver->resolve(array('sonata_field_description' => object(FieldDescription), 'class' => null, 'model_manager' => object(ModelManager), 'multiple' => false, 'label_render' => false, 'label' => 'Description'))
in /var/www/Project/vendor/symfony/symfony/src/Symfony/Component/Form/ResolvedFormType.php line 109
at Symfony'Component'Form'ResolvedFormType->createBuilder(object(FormFactory), 'description', array('sonata_field_description' => object(FieldDescription), 'class' => null, 'model_manager' => object(ModelManager), 'multiple' => false, 'label_render' => false, 'label' => 'Description'))
in /var/www/Project/vendor/symfony/symfony/src/Symfony/Component/Form/Extension/DataCollector/Proxy/ResolvedTypeDataCollectorProxy.php line 82
at Symfony'Component'Form'Extension'DataCollector'Proxy'ResolvedTypeDataCollectorProxy->createBuilder(object(FormFactory), 'description', array('sonata_field_description' => object(FieldDescription), 'class' => null, 'model_manager' => object(ModelManager), 'multiple' => false, 'label_render' => false, 'label' => 'Description'))
in /var/www/Project/vendor/symfony/symfony/src/Symfony/Component/Form/FormFactory.php line 87
at Symfony'Component'Form'FormFactory->createNamedBuilder('description', 'sonata_type_model', null, array('sonata_field_description' => object(FieldDescription), 'class' => null, 'model_manager' => object(ModelManager), 'multiple' => false, 'label_render' => false, 'label' => 'Description'))
in /var/www/Project/vendor/symfony/symfony/src/Symfony/Component/Form/FormBuilder.php line 106
at Symfony'Component'Form'FormBuilder->create('description', 'sonata_type_model', array('sonata_field_description' => object(FieldDescription), 'class' => null, 'model_manager' => object(ModelManager), 'multiple' => false, 'label_render' => false, 'label' => 'Description'))
in /var/www/Project/vendor/symfony/symfony/src/Symfony/Component/Form/FormBuilder.php line 268
at Symfony'Component'Form'FormBuilder->resolveChildren()
in /var/www/Project/vendor/symfony/symfony/src/Symfony/Component/Form/FormBuilder.php line 216
at Symfony'Component'Form'FormBuilder->getForm()
in /var/www/Project/app/cache/dev/classes.php line 9671
at Sonata'AdminBundle'Admin'Admin->buildForm()
in /var/www/Project/app/cache/dev/classes.php line 9930
at Sonata'AdminBundle'Admin'Admin->getForm()
in /var/www/Project/vendor/sonata-project/admin-bundle/Controller/CRUDController.php line 353
at Sonata'AdminBundle'Controller'CRUDController->editAction('1')
in line
at call_user_func_array(array(object(CRUDController), 'editAction'), array('1'))
in /var/www/Project/app/bootstrap.php.cache line 3022
at Symfony'Component'HttpKernel'HttpKernel->handleRaw(object(Request), '1')
in /var/www/Project/app/bootstrap.php.cache line 2984
at Symfony'Component'HttpKernel'HttpKernel->handle(object(Request), '1', true)
in /var/www/Project/app/bootstrap.php.cache line 3133
at Symfony'Component'HttpKernel'DependencyInjection'ContainerAwareHttpKernel->handle(object(Request), '1', true)
in /var/www/Project/app/bootstrap.php.cache line 2377
at Symfony'Component'HttpKernel'Kernel->handle(object(Request))
in /var/www/Project/web/app_dev.php line 28
这个错误的原因是教程中的错误复制/粘贴。
在Admin类中,函数configureFormFields包含一个描述不正确的字段"Description"。
->with('Description')
->add('description', 'sonata_type_model', array('multiple' => false))
->end()
我不得不将其替换为:
->with('Description')
->add('description')
->end()
我发现自动生成Admin Class骨架是Sonata Admin Bundle的一个功能。为了自动生成,执行:
php应用程序/控制台sonata:admin:生成
然后输入实体的完整路径,在本例中为:
平台''项目包''实体''生物样本
管理捆绑包将解析您的实体和:
- 生成管理类文件
- 在应用程序捆绑包的service.yml中添加一个条目
- 为CRUD控制器生成选项
我想这应该是从sonata管理包开始时首选的方法。
我遇到了同样的问题,出于某种原因,我忽略了,而不是在过去的项目中,我做了完全相同的事情。。。经过一个小时的搜索,我意识到我的表"fos_user_user_group"还没有创建,映射也没有创建。因此,我的解决方案只是覆盖我的实体User的groups属性,以便定义条令ORM映射:
/**
* The User can have many groups.
* @ORM'ManyToMany(targetEntity="Group")
* @ORM'JoinTable(name="fos_user_user_group",
* joinColumns={@ORM'JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM'JoinColumn(name="group_id", referencedColumnName="id")}
* )
*/
protected $groups;
之后,学说:图式:更新——力量和问题得到了解决;)
如果你像我一样,先创建数据库,然后通过控制台创建yml文件和类,那么你的注释就没用了。
Sonata使用yml而不是注释。它们是存在的,看起来是有效的,但它们就是不起作用。要发出"类不存在"的消息,请检查yml定义所说的内容。我需要在那里添加关系和实体类。
如果这确实是导致错误的原因,您可能希望通过删除或移动yml或xml模板来激活注释(..''Resources''config''doctrine)。