我在 Sonata Admin 顶部有一个项目设置。我正在经历一些新的和胡说八道的事情,这是我第一次看到。我有实体Media
(请参阅帖子中的定义),您可以在其中看到几乎所有内容都不可为空,事实上,如果我检查数据库架构,我可以NOT NULL
在列中看到约束$title
,$titleHtml
以及其他一些。我有一个MediaAdmin
控制器(请参阅帖子中的定义)。如果我删除title
andtitleHtml
和其他列中的所有内容并点击Update
按钮,很惊讶我可以保存那个实体,我问自己,怎么做?这里的魔力在哪里?我很惊讶,没有逻辑解释,但问题是这是错误的,不应该发生,我该如何解决?我的代码有问题吗?为什么会这样?我正在使用 2.7.5,我正在 DEV 环境中进行测试
媒体实体
/**
* @ORM\Entity
* @ORM\Table(name="media", options={"collate"="utf8_general_ci"})
*/
class Media
{
use IdentifierAutogeneratedTrait;
use TimestampableEntity;
use UploadTrait;
/**
* @var string
* @ORM\Column(type="string", length=45, nullable=true)
*/
protected $media_type;
/**
* @var string
* @ORM\Column(type="string", length=45)
*/
protected $title;
/**
* @var string
* @ORM\Column(type="string", length=45)
*/
protected $titleHtml;
/**
* @var string
* @ORM\Column(type="text")
*/
protected $description;
/**
* @var string
* @ORM\Column(type="text")
*/
protected $descriptionHtml;
/**
* @var string
* @ORM\Column(type="string", length=255, nullable=true)
*/
protected $thumbnail_url = '';
/**
* @var string
* @ORM\Column(type="string", length=255)
*/
protected $media_url;
/**
* @var string
* @ORM\Column(type="string", length=45)
*/
protected $media_code;
/**
* @var bool
* @ORM\Column(type="boolean")
*/
protected $inactive = false;
/**
* @var bool
* @ORM\Column(type="boolean")
*/
protected $useHtml = false;
/**
* @var Brand
* @ORM\ManyToOne(targetEntity="Brand")
* @ORM\JoinColumn(name="brands_id", referencedColumnName="id")
*/
protected $brand;
/**
* @ORM\ManyToMany(targetEntity="Email", mappedBy="emailsMediaXref", cascade={"persist"})
*/
protected $mediaXrefMail;
....
}
媒体管理控制器
protected function configureFormFields(FormMapper $formMapper)
{
$image = $this->getSubject();
$fileFieldOptions = array('required' => false, 'label' => 'Thumbnail');
$fileMediaFieldOptions = array('required' => true, 'label' => 'Media File');
if ($image && ($webPath = $image->getThumbnailUrl())) {
$fileFieldOptions['help'] = 'Thumbnail: <img src="'.$webPath.'" class="admin-preview img-rounded img-responsive"/>';
$fileMediaFieldOptions['help'] = 'Type: '.$image->getMediaType().'<br/>Name: '.$image->getMediaUrl();
}
$formMapper
->with('Information', array('class' => 'col-md-6'))
->add('title', null, array(
'label' => 'Title (text format)'
))
->add('titleHtml', 'ckeditor', array(
'config_name' => 'default_config',
'label' => 'Title (HTML format)'
))
->add('description', null, array(
'label' => 'Description (text format)'
))
->add('descriptionHtml', 'ckeditor', array(
'config_name' => 'default_config',
'label' => 'Description (HTML format)',
'attr' => array(
'row' => 5
)))
->add('useHtml', null, array('required' => false))
->add('inactive', null, array('required' => false))
->end()
->with('Brand', array('class' => 'col-md-6'))
->add('brand', 'sonata_type_model_list', array(
'btn_add' => 'Add', //Specify a custom label
'btn_list' => 'Select', //which will be translated
'btn_delete' => false, //or hide the button.
), array(
'placeholder' => 'No Brand selected',
))
->end()
->with('Media', array('class' => 'col-md-6'))
->add('file', 'file', $fileFieldOptions)
->add('media_file', 'file', $fileMediaFieldOptions)
->add('media_type')
->add('media_code')
->end();
}
编辑 1:测试 1
我更改了以下代码行:
/**
* @var string
* @ORM\Column(type="string", length=45)
*/
protected $title;
对此:
/**
* @var string
* @ORM\Column(type="string", length=45, nullable=false)
*/
protected $title;
然后我运行以下命令并得到如下所示的结果:
doctrine:schema:update --force
Nothing to update - your database is already in sync with the current entity metadata.
然后我尝试通过将列title
留空来更新它,我可以在查询中看到这个结果:
UPDATE media SET title = ?, titleHtml = ?, description = ?, descriptionHtml = ?, media_code = ?, updatedAt = ? WHERE id = ? [null,"sdfsdfsd",null,null,null,"2015-10-22 21:07:25",12]
我仍然不知道问题出在哪里,为什么允许这样做,有吗?