Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

J'essais d'auto généré un slug apartir de son nom. Je veux que les règles de validation le détecter ce changement.

// RoleRequest
/**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        if (empty($this->input('slug'))) {
            $this['slug'] = str_slug($this->input('name'));
        } else {
            $this['slug'] = str_slug($this->input('slug'));
        }
        $rules = [
            'name' => 'required|string|min:5|max:255|unique:roles',
            'slug' => 'required|string|min:5|max:255|unique:roles'
        ];
        if ($roles = $this->route('role')) {
            $rules['slug'] .= ',slug,' . $roles->id;
        }
        return $rules;
    }
// RolesController
/**
     * @param Role $role
     * @param RoleRequest $request
     * @return \Illuminate\Http\RedirectResponse
     */
    public function update(RoleRequest $request, Role $role)
    {
        $role->update($request->all());
        return redirect(route('backend.roles.index'))->with('success', "The role was created");
    }

Quand je fait un dd($rules) j'obtient ceci :

array: [
  "name" => "required|string|min:5|max:255|unique:roles"
  "slug" => "required|string|min:5|max:255|unique:roles,slug,1"
]

je fait un dd($this->input()) pour voir les donnés du champs j'ai ceci :

array: [
  "_method" => "PUT"
  "_token" => "qRpjXe4lhVnzrjaq8gxwDXeNV6qznQsewE4lEpFZ"
  "id" => "1"
  "name" => "Member"
  "slug" => "member"
]

Ce que je veux

Les règles de validation accepte ce changement si un utilisateur laisse le champ "slug" vide.

Ce que j'obtiens

J'ai une erreur qui dit que le champ "slug" ne peut pas être vide. Pourtant dans ma RoleRequest j'ai ce système qui auto dévine le slug depuis son nom. En téorie ça doit passé les règle de validation?

Merci de votre aide

2 réponses


lakamark
Auteur

Bonjour J'ai éssayé votre code. Il faut que j'enlève toute les règles de validations dans mon slug?

$rules = [
            'name' => 'required|string|min:5|max:255|unique:roles',
            'slug' => 'required|string|min:5|max:255|unique:roles'
        ];

par

$rules = [
            'name' => 'required|string|min:5|max:255|unique:roles',
            'slug' => ''
        ];

Il y a pas d'autre moyen?

lakamark
Auteur

Merci @Gregk! j'ai trouver une solution pour garder mes règle de validation sur l'unique et pour palier le problème de mises-à-jours de contentenu. :

public function rules()
    {
        if (empty($this->input('slug'))) {
            $this['slug'] = str_slug($this->input('name'));
        } else {
            $this['slug'] = str_slug($this->input('slug'));
        }
        $rules = [
            'name' => [
                'required',
                'string',
                'max:255',
                Rule::unique('roles')->ignore($this->id)
            ],
           'slug' => 'max:255|unique:roles'
        ];
        if ($roles = $this->route('role')) {
            $rules['slug'] .= ',slug,' . $roles->id;
        }
        return $rules;
    }