Странное поведение с Laravel 6 Аргументами в Контроллере - PullRequest
0 голосов
/ 25 января 2020

При создании контроллера Laravel 6 обнаружено странное поведение.

У меня есть два маршрута с именем

Route::resource('role', 'RoleController')->middleware('verified');
Route::resource('category', 'MainCategoryController')->middleware('verified');

Оба работают нормально. В обоих контроллерах у меня есть метод редактирования

RoleController

public function edit(Role $role)
    {
        $permissions = Permission::get();
        $users = User::get();
        return view('roles.edit', compact('role', 'permissions', 'users'));
    }

MainCategoryController

public function edit($mainCategory)
    {
        $mainCategory = MainCategory::findOrFail($mainCategory);
        // dd($mainCategory);
        return view('categories.edit', compact('mainCategory'));
    }

Моя проблема в том, что если я использую в MainCategoryController.edit в качестве аргумента MainCategory $ mainCategroy это не дает мне данные модели, а выглядит так. В обычных случаях, если он не может найти модель, это маршруты на 404.

App\MainCategory {#471 ▼
  #guarded: []
  #connection: null
  #table: null
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  #perPage: 15
  +exists: false
  +wasRecentlyCreated: false
  #attributes: []
  #original: []
  #changes: []
  #casts: []
  #dates: array:1 [▶]
  #dateFormat: null
  #appends: []
  #dispatchesEvents: []
  #observables: []
  #relations: []
  #touches: []
  +timestamps: true
  #hidden: []
  #visible: []
  #fillable: []
  #forceDeleting: false
}

Если я запрашиваю данные модели, как в функции выше, все работает нормально. В RoleController.edit он работает нормально, и я получаю запрошенные данные.

Я не знаю, почему он работает в Role, а не в MainCategory.

Может быть, у кого-то есть идея, что Я ошибся здесь, потому что не могу понять свою ошибку.

1 Ответ

1 голос
/ 25 января 2020

Имя вашей переменной должно совпадать с именем параметра в маршруте. Если вы сделаете php artisan route:list, вы увидите что-то вроде этого:

| GET|HEAD  | category/{category}/edit | category.edit    | App\Http\Controllers\MainCategoryController@edit    | web        |

Это означает, что ваш контроллер должен иметь такую ​​подпись:

public function edit(MainCategory $category)
{
   dd($category);
}

Если ваш имя переменной не совпадает, как в вашем случае, она создаст новый экземпляр из-за внедрения зависимости :

public function edit(MainCategory $mainCategory)
{
    dd($mainCategory); // New instance of App\MainCategory
}

Подробнее о неявном связывании можно прочитать: https://laravel.com/docs/6.x/routing#implicit -связывающего

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...