Bonjour,

Voici une question de noob sur Laravel. J'apprends la POO tout en me familiarisant avec le framework.
J'en suis aux FormRequest, et donc j'ai ma method Rules().
J'ai vu une option s'appelant unique (que j'utilise sur le name) qui me pose des problèmes lorsque je fais un edit. En effet, Laravel refuse de me valider ma modification car il existe déjà une entrée portant ce name... Ce qui est normal vu que je suis en train de l'éditer.
J'ai vu sur la doc qu'il y avait une solution pour ça, mais je ne sais pas comment la mettre en place.
Voici mon code.

Route :

Route::resource('editeurs', 'PublishersController');

Controller :

class PublishersController extends Controller
{
    /* List all publishers */
    public function index()
    {
        $publishers = Publisher::orderBy('name', 'asc')->get();

        return view('publishers.index', compact('publishers'));
    }

    /* Display a publisher */
    public function show($slug)
    {
        $publisher = Publisher::where('slug', $slug)->firstOrFail();

        return view('publishers.show', compact('publisher'));
    }

    /* Create a new publisher */
    public function create()
    {
        return view('publishers.create');
    }

    /* Save a new publisher */
    public function store(PublisherRequest $request)
    {
        $input = $request->all();

        $publisher = new Publisher([
            'name' => $input['name'],
            'slug' => my_slug($input['name'])
        ]);

        $publisher->save();

        return redirect('editeurs');
    }

    /* Edit an existing publisher */
    public function edit($slug)
    {
        $publisher = Publisher::where('slug', $slug)->firstOrFail();

        return view('publishers.edit', compact('publisher'));
    }

    /* Update an existing publisher */
    public function update($slug, PublisherRequest $request)
    {
        $publisher = Publisher::where('slug', $slug)->firstOrFail();

        $input = $request->all();

        $publisher->name = $input['name'];
        $publisher->slug = my_slug($input['name']);

        $publisher->save();

        return redirect()->action('PublishersController@show', $publisher->slug);
    }
}

View :

@section('content')
    <div class="row">
        <h1 class="large-12 columns">Edition - {!! $publisher->name !!}</h1>

        {!! Form::model($publisher, ['method' => 'PATCH', 'action' => ['PublishersController@update', $publisher->slug]]) !!}
        <div class="large-12 columns">
            {!! Form::label('name', 'Nom de l\'éditeur') !!}
            {!! Form::text('name', null, ['placeholder' => 'Nom de l\'éditeur']) !!}
        </div>

        <div class="large-12 columns">
            {!! Form::submit('Ajouter un éditeur', ['class' => 'button expand']) !!}
        </div>
        {!! Form::close() !!}

        @if ($errors -> any())
            <div class="large-12 columns">
                <div data-alert class="alert-box alert">
                    <ul>
                        @foreach ($errors->all() as $error)
                            <li>{{ $error }}</li>
                        @endforeach
                    </ul>
                </div>
            </div>
        @endif
    </div>
@stop

FormRequest :

class PublisherRequest extends Request
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {

        //dd($this);
        return [
            'name' => 'required|unique:publishers,name,'.$this->request->parameters['name']
        ];
    }
}

Ce dernier essai me donne une erreur. Que mettre à la place de (sachant que je ne suis pas sûr que ce soit la bonne méthode) :

$this->request->parameters['name']

Merci d'avance.

2 réponses


Spiker
Réponse acceptée

Hello,

$this->get('name')

Normalement ça devrait être ça.

Nicolas Lemoine
Auteur
Réponse acceptée

Non, ça ne marchait pas. Par contre après un après-midi entier, une discussion Slack allongée et un peu d'aide depuis Stackoverflow, j'ai enfin trouver la réponse :

    public function rules()
    {
        $publisher = Publisher::where('slug', $this->editeurs)->first();

        return [
            'name' => 'required|unique:publishers,name,'.$publisher->id
        ];
    }

Je vais enfin pouvoir continuer. Merci.