Bonjour,
J'essaie de suivre le tuto sur laravel 10.
j'ai une erreur dans la vue

J'ai récupéré le code source de Grafikart. Je ne vois pas ce qui cloche

 <a href="{{ route('admin.property.edit', $property) }}" class="btn btn-primary">Editer</a>

Ce que j'obtiens

Missing required parameter for [Route: admin.property.edit] [URI: admin/property/{property}/edit] [Missing parameter: property].

quand je mets l'id en dur ça marche par exemple :

 <a href="{{ route('admin.property.edit', 2) }}" class="btn btn-primary">Editer</a>

Merci de votre aide

9 réponses


longh
Auteur
Réponse acceptée

J'ai trouvé mon erreur. je suis confus.
En ajoutant les champs que je souhaitais et avant de faire la migration pour créer la table, j'ai malencontreusement effacé le $table->id();.

....
Schema::create('properties', function (Blueprint $table) {
            $table->id();
....

Du coup il ne pouvait pas pointer vers l'élément comme il faut. (J'ai besoin de vacances...)

Pour répondre à ta question j'ai changé la route pour tester en mettant :

Route::prefix('admin')->name('admin.')->group(function () {
    Route::resource('property', \App\Http\Controllers\Admin\PropertyController::class)->except(['show'])->names([
        'edit' => 'property.edition'
    ]);
});

Et la ligne dans la vue ressemble à ça du coup :

<a href="{{ route('admin.property.edition', $property) }}" class="btn btn-primary">Editer</a>

Merci de ton aide et je suis désolé de t'avoir pris de ton temps. Par contre échanger avec toi m'a mis sur la piste. Merci encore j'ai appris plein de trucs aujourd'hui.

Hello :)

Alors plusieurs choses:

  • Dans web.php, tu as bien mis {property} à la fin de l'url?
  • Tu as bien un model Property et une migration properties?
  • Dans ton controller, ta fonction edit, en paramètre tu a bien typé le paramètre en Property? Dans ce genre: public function edit (Property $property)

Et sinon tu peux montrer le code de web.php, Property.php et la fonction edit de ton controller?

longh
Auteur

Bonjour,
un grand merci pour ton aide
voici ma route dans web.php ::

Route::prefix('admin')->name('admin.')->group(function () {
    Route::resource('property', \App\Http\Controllers\Admin\PropertyController::class)->except(['show']);
});

résultat de artisan route concerant property:

  GET|HEAD        admin/property ................................................................. admin.property.index › Admin\PropertyController@index
  POST            admin/property ................................................................. admin.property.store › Admin\PropertyController@store
  GET|HEAD        admin/property/create ........................................................ admin.property.create › Admin\PropertyController@create
  PUT|PATCH       admin/property/{property} .................................................... admin.property.update › Admin\PropertyController@update
  DELETE          admin/property/{property} .................................................. admin.property.destroy › Admin\PropertyController@destroy
  GET|HEAD        admin/property/{property}/edit ................................................... admin.property.edit › Admin\PropertyController@edit

J'ai bien un model Property et j'ai ma migration properties. J'ai déjà des enregistrements dans la table

Voici mon fichier Property.php:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Property extends Model
{
    use HasFactory;
    protected $fillable = [
        'title',
        'description',
        'surface',
        'rooms',
        'bedrooms',
        'floor',
        'price',
        'city',
        'address',
        'postal_code',
        'sold',
    ];
}

mon edit du controller :

public function edit(Property $property)
    {
        return view('admin.properties.form', [
            'property' => $property
        ]);
    }

J'ai vraiment suivi à la lettre en essayant de bien comprendre le tuto.
merci bcp.

De rien ^^

Mmmh bizarre ça m'a l'air bon :/

Essaye de voir si ça ça fonctionne: <a href="{{ route('admin.property.edit', ['property' => $property]) }}" class="btn btn-primary">Editer</a>

Ah petite parenthèse, faut éviter d'utiliser la propriété $fillable, niveau sécurité c'est mieux d'utiliser Eloquent :p

longh
Auteur

Merci,
j'avais déjà essayé avec ['property' => $property]), sans succès là non plus. J'ai la même erreur
($fillable) : merci je vais regarder Eloquent :)

Ah mais je viens de voir, te manque le name dans la route

Route::prefix('admin')->name('admin.')->group(function () {
    Route::resource('property', \App\Http\Controllers\Admin\PropertyController::class)->except(['show'])->name('property.edit');
});
longh
Auteur

Normalement Route::resource génère toutes les routes et les name aussi non ?

longh
Auteur

J'ai essayé ce que suggère la doc https://laravel.com/docs/10.x/controllers#restful-naming-resource-routes pour nommer toutes les routes comme dans cette exemple :

use App\Http\Controllers\PhotoController;

Route::resource('photos', PhotoController::class)->names([
    'create' => 'photos.build'
]);

sans succès non plus. Mystère ce truc

Mmmh je n'ai jamais utilisé resource ^^'

Pour ta solution, dans names, tu as mis admin.property.edit ou property.edit? (vus que tu as ajouté admin dans un préfixe faut pas le mettre)

Ahah ah oui sans id c'est sur qu'il aurait eu du mal à trouver xD

Pas de soucis et avec plaisir ;)