如何在 Symfony 4 的输入文件中显示错误?

How to display error on my input file on Symfony 4?

我在做我的第一个 symfony 项目,我需要为带有上传输入的表单创建漂亮的错误。

实际上,我成功地将参数更改为 20Mo 的限制 post 和 20Mo 的上传文件大小限制。

在我的实体中,我的 属性 "portfolio".

有一个断言(由 symfony 提供)
    /**
 * @Assert\File(
 *     maxSize="5M",
 *     mimeTypes = {"application/pdf"},
 *     mimeTypesMessage = "Votre fichier doit être au format PDF"
 * )
 */
public $portfolio;

顺便说一句,我按照 symfony 文档中的要求进行了导入。

当我尝试验证错误的表单时,我有 twig 表达式来直接显示我的错误。

这是我的控制器的功能:

  public function formjob(\Swift_Mailer $mailer, Request $request)
{
    $job = new JobForm();

    $form = $this->createFormBuilder($job)
        ->add("name", TextType::class, [
            "label" => "Nom :"
        ])
        ->add("firstName", TextType::class, [
            "label" => "Prénom :"
        ])
        ->add("mail", EmailType::class, [
            "label" => "E-mail :"
        ])
        ->add("telephone", TelType::class, [
            "label" => "Tel. ",
            "required" => false,
            "empty_data" => "Non Renseigné"
        ])
        ->add("url", UrlType::class, [
            "label" => "Envoyez-nous l’adresse internet vers vos réalisations",
            "required" => false,
        ])
        ->add("portfolio", FileType::class, [
            "label" => "Envoyez votre portfolio au format PDF",
            "required" => false,
            "error_bubbling" => true
        ])
        ->add("envoyer", SubmitType::class)
        ->getForm();

    $form->handleRequest($request);


    if($form->isSubmitted() && $form->isValid()) {

        $data = $form->getData();
        $attachment = $data->portfolio;
        $mail = $data->mail;
        if(isset($attachment) || isset($data->url)) {
            $message = (new \Swift_Message())
                ->setSubject('Formulaire Job')
                ->setFrom($mail)
                ->setTo('nicolas.trinquet@laposte.net')
                ->setBody(
                    $this->renderView(
                        'mail/mailjob.html.twig', [
                            'data' => $data
                        ]
                    ),
                    'text/html'
                );
            if (isset($attachment)) {
                $message->attach(\Swift_Attachment::fromPath($attachment)->setFilename('portfolio.pdf')->setContentType('application/pdf'));
            }
            $mailer->send($message);

            return $this->redirectToRoute('sent');
        }
    }
    return $this->render('main/formJob.html.twig', [
        'form'=> $form->createView(),
    ]);
}

这是我的模板:

    {% extends 'layout.html.twig' %}{% block title %}Jobs{% endblock %}{% block stylesheets %}<link rel="stylesheet" type="text/css" href="formJobs.css"> {%  endblock %}{% block body %}<div class="row">
    <div class="col-lg-12">
        <h1 class="antiqueO">Postuler</h1>

        <h2 class="robotoR">Intitulé du poste</h2>
        <h3 class="robotoM">Type de poste</h3>

        <p class="robotoR">Description du poste</p>

        <div class="trait_noir_separation"></div>

        {{ form_start(form) }}
            <div class="col-lg-12">
                {{ form_label(form.name) }}
            </div>
            <div class="col-lg-12">
                {{ form_errors(form.name) }}
                {{ form_widget(form.name) }}
            </div>

        <div class="col-lg-12">
            {{ form_label(form.firstName) }}
        </div>
        <div class="col-lg-12">
            {{ form_errors(form.firstName) }}
            {{ form_widget(form.firstName) }}
        </div>

        <div class="col-lg-12">
            {{ form_label(form.mail) }}
        </div>
        <div class="col-lg-12">
            {{ form_errors(form.mail) }}
            {{ form_widget(form.mail) }}
        </div>

        <div class="col-lg-12">
            {{ form_label(form.telephone) }}
        </div>
        <div class="col-lg-12">
            {{ form_errors(form.telephone) }}
            {{ form_widget(form.telephone) }}
        </div>

        <div class="col-lg-12">
            {{ form_label(form.url) }}
        </div>
        <div class="col-lg-12">
            {{ form_errors(form.url) }}
            {{ form_widget(form.url) }}
        </div>

        <div class="col-lg-12">
            {{ form_label(form.portfolio) }}
        </div>
        <div class="col-lg-12">
            {{ form_errors(form.portfolio) }}
            {{ form_widget(form.portfolio, {'attr': {'class': 'form-control-file', 'accept' : 'application/pdf'}})}}
        </div>
        <div>
            {{ form_widget(form.envoyer, {'attr': {'class': 'antiqueO send_button'}}) }}
        </div>
        {{ form_end(form) }}
    </div>
</div>{% endblock body %}

其实我有一个问题:我所有的错误都可以被触发和显示。 但是我的文件输入错误拒绝显示,即使我的分析器工具栏中有错误:

Profiler Toolbar for size error

Profiler Toolbar for format error

我的代码有什么问题?是什么阻止了我的错误显示?

基于https://symfony.com/doc/current/reference/forms/types/text.html#error-bubbling

error_bubbling type: boolean default: false unless the form is compound

If true, any errors for this field will be passed to the parent field or form. For example, if set to true on a normal field, any errors for that field will be attached to the main form, not to the specific field.

因此,当您在 portfilo 属性 中使用此属性时,错误显示在

{{ form_errors(form) }}

而不是

{{ form_errors(form.portfolio) }}

只需尝试在 formjob 函数中从投资组合 属性 中删除 error_bubbling,错误应该会显示在您的表单中