Хобрук: Ваш путь к мастерству в программировании

Vichuploader не работает на рабочем сервере

У меня проблема уже 2 дня! Я пытаюсь загрузить файл с помощью vichuploaderBundle в проект Symfony 3.4.

Я уже делал это много раз. Но на этот раз... Это не работает, и я не понимаю, почему. В моей локальной версии это работает нормально, но на моем рабочем сервере это не работает.

Вот сообщение об ошибке: SQLSTATE[23000]: нарушение ограничения целостности: 1048 Столбец 'image_name' не может быть нулевым

Сущность файла сохраняется (с идентификатором и датой создания, но имя изображения пусто ???) это похоже на то, что сопоставление vichuploader не работает ???

У меня есть Entity (NoteFrais), и каждый NoteFrais имеет одно отношение с другим Entity (JustificatifDefraiement).

вот моя сущность JustificatifDefraiement:

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Vich\UploaderBundle\Mapping\Annotation as Vich;

/**
 * JustificatifDefraiement
 *
 * @ORM\Table(name="justificatif_defraiement")
 * @ORM\Entity(repositoryClass="MKG\MystiBundle\Repository  \JustificatifDefraiementRepository")
 * @vich\Uploadable
 */
class JustificatifDefraiement
{
/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * NOTE: This is not a mapped field of entity metadata, just a simple property.
 *
 * @Vich\UploadableField(mapping="justificatif", fileNameProperty="imageName")
 *
 * @var File
 */
private $imageFile;

/**
 * @ORM\Column(type="string", length=255)
 *
 * @var string
 */
private $imageName;


/**
 * @ORM\Column(type="datetime")
 *
 * @var \DateTime
 */
private $updatedAt;

/**
 * Constructor
 */
public function __construct()
{
    $this->updatedAt = new \DateTime();
}

/**
 * If manually uploading a file (i.e. not using Symfony Form) ensure an instance
 * of 'UploadedFile' is injected into this setter to trigger the  update. If this
 * bundle's configuration parameter 'inject_on_load' is set to 'true' this setter
 * must be able to accept an instance of 'File' as the bundle will inject one here
 * during Doctrine hydration.
 *
 * @param File|UploadedFile $justificatifDefraiement
 * @return JustificatifDefraiement
 */
public function setImageFile(File $justificatifDefraiement = null)
{
    $this->imageFile = $justificatifDefraiement;

    if ($justificatifDefraiement) {
        $this->updatedAt =  new \DateTime();
    }

    return $this;

}

/**
 * @return File|null
 */
public function getImageFile()
{
    return $this->imageFile;
}



/**
 *
 * @param $imageName
 *
 * @return $this
 */
public function setImageName($imageName)
{
    $this->imageName = $imageName;

    return $this;
}

/**
 * @return string|null
 */
public function getImageName()
{
    return $this->imageName;
}

/**
 * Set updatedAt
 *
 * @param \DateTime $updatedAt
 *
 * @return JustificatifDefraiement
 */
public function setUpdatedAt($updatedAt)
{
    $this->updatedAt = $updatedAt;

    return $this;
}

/**
 * Get updatedAt
 *
 * @return \DateTime
 */
public function getUpdatedAt()
{
    return $this->updatedAt;
}

/**
 * Get id
 *
 * @return int
 */
public function getId()
{
    return $this->id;
}
}

Моя форма:

class JustificatifDefraiementType extends AbstractType
{
/**
 * {@inheritdoc}
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('imageFile', FileType::class, array(
        //'data_class' => null,
        'label' => false,
        'required' => true,
        'attr' => array(
            'class' => 'NoteFraisBootstrapFileInput',
            'type' => 'file',
            'placeholder' => 'Selectionner un justificatif (jpeg, png, jpg, pdf)',
            'data-preview-file-type' => 'text',
            'data-allowed-file-extensions' => '["jpeg", "png", "jpg", "pdf"]',
        )
    ));
}
/**
 * {@inheritdoc}
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'MKG\MystiBundle\Entity\JustificatifDefraiement'
    ));
}

/**
 * {@inheritdoc}
 */
public function getBlockPrefix()
{
    return 'mkg_mystibundle_justificatifDefraiement';
}
}

Конфигурация:

parameters:
locale: fr
app.path.logos: /uploads/logos
app.path.imports: /uploads/imports
app.path.justificatifs: /uploads/justificatifs

У меня есть это отношение с другим объектом:

class NoteFrais
{
//.......//
/**
 * @ORM\OneToOne(targetEntity="MKG\MystiBundle\Entity\JustificatifDefraiement", cascade={"persist"})
 * @ORM\JoinColumn(name="justificatif_defraiement_id", referencedColumnName="id", onDelete="CASCADE", nullable=true)
 */
private $justificatifDefraiement;
//.......//
}

И noteFraisType:

class NoteFraisType extends AbstractType
{
/**
 * {@inheritdoc}
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        //.......//
        ->add('justificatifDefraiement', JustificatifDefraiementType::class, array(
            'required' => false));
}
/**
 * {@inheritdoc}
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'MKG\MystiBundle\Entity\NoteFrais'
    ));
}

/**
 * {@inheritdoc}
 */
public function getBlockPrefix()
{
    return 'mkg_mystibundle_notefrais';
}

}

Помогите мне, пожалуйста!!


  • Вы выполнили доктрину: схему: обновление на консоли? 28.12.2018
  • Да, я делал это несколько раз... 28.12.2018

Ответы:


1

Когда вы используете VichUploader, вы должны использовать VichFileType внутри вашего FormType.

Тогда ваша форма сборки...

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('imageFile', VichFileType::class, array(
        //Options ...
    ));
}
28.12.2018
  • Да, я знаю... И я уже сделал это, но это не работает. Я использую этот пакет для загрузки файлов в тот же проект, и я использую FileType в своих формах, и он работает очень хорошо! 28.12.2018
  • Новые материалы

    мои январские чтения по программированию
    Эрик Эллиот Программирование приложения JavaScript Эл Свейгарт «Автоматизируйте скучные вещи с помощью Python» Прогрессивное веб-приложение Google..

    Создание ассоциаций секвелизации с помощью инструмента командной строки Sequelize
    Sequelize - популярный, простой в использовании инструмент объектно-реляционного сопоставления (ORM) JavaScript, который работает с базами данных SQL. Довольно просто начать новый проект с..

    Искусственный интеллект в юридической отрасли - пример прогнозирования судебных решений с помощью глубокого обучения
    На протяжении всей истории люди полагались на суды, присяжных, королей и королев в отправлении правосудия. Сегодня способность судов обеспечивать справедливое и быстрое правосудие для своих..

    Введение в машинное обучение для обнаружения аномалий (часть 1)
    Тщательно созданный, тщательно спроектированный ресурс для специалистов по данным. Часть 1 Главы 03 из Руководства по машинному обучению для обнаружения аномалий Внимание! Прежде чем вы..

    Начало работы с Pulumi в Digital Ocean
    Цифровой океан (ДО) — отличная альтернатива многим другим поставщикам облачных услуг. DO предоставляет простой и понятный пользовательский интерфейс, упрощающий управление инфраструктурой и..

    #Day68 из #100days_of_coding
    Вчера был мой 68-й день кодинга. я решил один вопрос Проблема: Разбить двоичную строку на подстроки с равным количеством нулей и единиц Дана двоичная строка str длины N . Задача состоит..

    Воспроизведение теперь возможно с помощью React
    Как я реализовал Reparenting с помощью нескольких строк кода Я разрабатываю приложение, похожее на Trello . На главной странице мне нужны несколько вертикальных списков и несколько..