Регулярное выражение в symfony4 - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть небольшая проблема с моим регулярным выражением. Все кажется правильным, и я проверил документы Symfony, но на моей странице У меня нет сообщения, в то время как $ url неверен . .

( это просто показывает мне страницу с ошибкой, как поле пустое, если я ввожу неправильный $ url и если он верный, ошибки нет )

о чём может кто-то думать? :)

Спасибо

<?php

namespace App\Entity;


use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Table(name="media_video")
 * @ORM\Entity(repositoryClass="App\Repository\MediaVideoRepository")
 * @ORM\HasLifecycleCallbacks // Permet d’utiliser des événements
 */
class MediaVideo
{
    /********** ATTRIBUTS **********/

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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

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



    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\tricks", inversedBy="mediaVideos")
     * @ORM\JoinColumn(nullable=false)
     */
    private $trick;

    /**
     * @Assert\Regex(
     *     pattern="#^(http|https)://(www.youtube.com|www.dailymotion.com)/#",
     *     match=true,
     *     message="L'url doit correspondre à l'url d'une vidéo Youtube ou DailyMotion"
     * )
     */
    private $url;

Это ошибка, которая появляется =>

Исключение было сгенерировано во время рендеринга шаблона ("Параметр" id "для маршрута" deleteVideo "должен соответствовать" [^ /] ++ "(" "дано) для создания соответствующего URL-адреса." ).

Вот шаблон =>

{% extends 'base.html.twig' %}


{% block content %}

    <section class="page-section about-heading">
        <div class="container">
            <div class="row" id="box-search">
                <div class="thumbnail text-center">
                    <img class="img-fluid rounded about-heading-img mb-3 mb-lg-0"  src="{{ asset('img/sky.jpg') }}" alt="trick">
                    <div class="caption">
                        <h2 class="section-heading mb-4">
                            <span class="section-heading-upper">Edite ta figure</span>
                            <span class=" titre section-heading-lower">{{ trick.name }}</span>
                        </h2>
                    </div>
                </div>
            </div>
            <div class="about-heading-content">
                <div class="row">
                    <div class="col-xl-9 col-lg-10 mx-auto">
                        <div class="bg-faded rounded p-5">
                            <span class="col-lg-3 badge badge-success edit-span">Créé le 10/10/2018</span>
                            {# AFFICHAGE DES IMAGES #}
                            <div class="album">
                                <div class="container">
                                    {% if trick.hasImages  %}
                                    <h1 class="marge">Images</h1>
                                    <div class="row jumbotron">
                                    {% for image in trick.images %}
                                        <div class="petite col-lg-4 media center-block ">
                                            <div class="row marge">
                                                <div class="  col-12">
                                                    <a href="{{ asset('uploads/'~image.path) }}" data-lightbox="roadtrip">
                                                    <img src="{{ asset('uploads/'~image.path) }}"/></a>
                                                </div>
                                                <div class="col-12">
                                                    <a href="{{ path('deleteImage', {'id': image.id}) }}" >
                                                        <button class="btn btn-danger btn-block" data-toggle="collapse" data-target="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
                                                            Supprimer
                                                        </button>
                                                    </a>
                                                </div>
                                            </div>
                                        </div>
                                    {% endfor %}
                                    </div>
                                    {% endif %}
                                    {# AFFICHAGE DES VIDEOS #}
                                    {% if trick.hasVideos  %}
                                    <h1 class="marge">Videos</h1>
                                    <div class="row jumbotron">
                                        {% for video in trick.mediaVideos %}
                                        <div class="col-lg-4 media marge">
                                            <div class="row">
                                                <div class="col-12">
                                                        {{ video.video|raw }}
                                                </div>
                                                <div class="col-12" id="videos">
                                                    <a href="{{ path('deleteVideo', {'id': video.id}) }}" class="btn btn-danger btn-block delete-item" data-id="{{ video.id }}">
                                                    Supprimer</a>
                                                </div>
                                            </div>
                                        </div>
                                        {% endfor %}
                                    </div>
                                    {% endif %}
                                </div>

                                {# FORMULAIRE #}
                                <div class="well">
                                {{ form_start(form, {'attr': {'class': 'form-horizontal'}}) }}
                                    <div class="form-group">
                                        <div class="row">
                                            {# Génération du label. #}
                                            {{ form_label(form.description, "Description :", {'label_attr': {'class': 'col-sm-2 control-label'}}) }}
                                            {# Affichage des erreurs pour ce champ précis. #}
                                            {{ form_errors(form.description) }}
                                            <div class="col-sm-10">
                                            {# Génération de l'input. #}
                                            {{ form_widget(form.description, {'attr': {'class': 'form-control rows="4" cols="50"'}}) }}
                                            </div>
                                        </div>
                                    </div>
                                    <div class="form-group">
                                        <div class="row">
                                            {# Génération du label. #}
                                            {{ form_label(form.groupe, "Groupe :", {'label_attr': {'class': 'col-sm-2 control-label'}}) }}
                                            {# Affichage des erreurs pour ce champ précis. #}
                                            {{ form_errors(form.groupe) }}
                                            <div class="col-sm-10">
                                            {# Génération de l'input. #}
                                            {{ form_widget(form.groupe, {'attr': {'class': 'form-control'}}) }}
                                            </div>
                                        </div>
                                    </div>
                                    <div class="ajout-media">
                                        {# VIDEO #}

                                        <ul class="list_ul" id="video-fields-list"
                                            data-prototype="{{ form_widget(form.mediaVideos.vars.prototype)|e }}"
                                            data-widget-tags="{{ '<li></li>'|e }}">
                                            {% for video in form.mediaVideos%}
                                                <div>
                                                    {{ form_errors(video) }}
                                                </div>
                                            {% endfor %}
                                        </ul>
                                        <div class="col-sm-7">
                                        <a href="#"
                                           class=" btn btn-info add-another-collection-widget_video"
                                           data-list="#video-fields-list">Ajouter une video</a>
                                        </div>
                                        {# IMAGE #}
                                        <ul class="list_ul" id="image-fields-list"
                                            data-prototype="{{ form_widget(form.images.vars.prototype)|e }}"
                                            data-widget-tags="{{ '<li></li>'|e }}">
                                        </ul>
                                        <div class=" col-sm-7">
                                            <a href="#"
                                               class="image_btn btn btn-info add-another-collection-widget"
                                               data-list="#image-fields-list">Ajouter une image
                                            </a><br>
                                        </div>
                                    </div>
                                    <div class="row">
                                        <div class="col-sm-12 envoyer">
                                            {{ form_widget(form.save, { 'label': 'Mettre à jour', 'attr': {'class': 'btn btn-signup  my-2 my-sm-0 pull-right'}}) }}
                                        </div>
                                        <a href="{{ path('delete', {'id': trick.id}) }}"><button type="button" class=" col-sm-12 btn btn-danger supprimer" >
                                          Supprimer
                                        </button></a>
                                    </div>
                                   <div class="hidden">
                                       {{ form_rest(form) }}
                                   </div>
                                {{ form_end(form) }}
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </section>
{% endblock %}
{% block javascripts %}
    {{ parent() }}
    <script type="text/javascript" src="{{ asset('vendor/js/add_media.js') }}"></script>
{% endblock %}

Это контроллер =>

  /**
     * @Route("/editer/{id}", name="edit")
     * @param $id
     * @param Request $request
     * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response
     */
    public function edit( $id, Request $request)
    {
        // $trick stock toutes les figures récupérées par la variable $trickRepo
        $trick = $this->trickRepo->find($id);

        if (null === $trick) {
            throw new NotFoundHttpException("Cette page n'existe pas");}


        $form = $this->createForm(TricksEditType::class, $trick);
        $form->handleRequest($request);

        /*
        *   isSubmitted() vérifie si le formulaire est soumis
        *  isValide valide les données saisies
        */
        if ($form->isSubmitted() && $form->isValid()) {

            /*
            * (persist) Demande au gestionnaire d'entités(entityManager) de suivre les modifications apportées à l'objet
            * (flush) Pousse les modifications des objets d’entités qu’il suit dans la base de données en une seule transaction
            */
            $this->entityManager->persist($trick);
            $this->entityManager->flush();

            $request->getSession()->getFlashBag()->add('notice', 'Annonce bien modifiée.');

            return $this->redirectToRoute('show', array('id' => $trick->getId()));
        }
        return $this->render('trick/edit.html.twig', array(
            'trick' => $trick,
            'form'   => $form->createView(),
        ));
    }

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Как и большинство других проверочных ограничений, ограничение Regex также будет оцениваться только тогда, когда значение не является пустым (это позволяет ограничению быть необязательным и применяться только тогда, когда значение действительно присутствует). В вашем случае схема вашей базы данных требует URL. Чтобы справиться с этим во время проверки вашего объекта, вы также должны добавить ограничение NotBlank :

// ...

class MediaVideo
{
    // ...

    /**
     * @Assert\NotBlank()
     * @Assert\Regex(
     *     pattern="#^(http|https)://(www.youtube.com|www.dailymotion.com)/#",
     *     match=true,
     *     message="L'url doit correspondre à l'url d'une vidéo Youtube ou DailyMotion"
     * )
     */
    private $url;

    // ...
}
0 голосов
/ 10 ноября 2018

Используйте это вместо:

^(http|https):\/\/(www\.youtube\.com|www\.dailymotion\.com)\/?
...