Привязка модели формы Laravel 5.5 Пользователь

Я изучаю laravel, и у меня есть следующая ошибка. Я хотел бы знать, может ли кто-нибудь помочь мне ее решить. У меня есть модель с именем User и контролируемый вызов UserController, я пытаюсь использовать привязку модели для редактирования, обновления и уничтожения. В функции редактирования у меня есть следующий код.

public function edit(User $user)
    {      
        dd($user); 
    }

Эта функция возвращает:

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

Если я удалю модель User

public function edit($user)
{ 

    dd($user); 

}

В данном случае возвращает идентификатор редактируемого пользователя /usuario/24/edit

"24"

Маршруты объявляются следующим образом

  Route::resource('/usuario','UsuarioController');

Я хотел бы знать, знает ли кто-нибудь, как решить эту проблему, поскольку функция должна ссылаться на модель пользователя, а затем на переменную $ user, если кто-то знает, как это исправить, или если я делаю что-то неправильно, это было бы очень полезно


person Gold    schedule 03.09.2017    source источник
comment
Я не уверен, в чем здесь проблема? Если вы наберете User, Laravel попытается внедрить его и вернет экземпляр модели. 24 — это идентификатор записи. Вы можете получить модель из идентификатора, например User::find(24);, и идентификатор из модели, например, $user->id. Чего вы пытаетесь достичь и что не работает?   -  person Giedrius    schedule 04.09.2017


Ответы (2)


Нет проблем с тем, что вы сообщаете здесь. Это желаемое поведение Laravel Framework.

Если вы наберете hint the Model, как в первом примере, Laravel под капотом попытается сделать:

$user = User::findOrFail($user)

Но когда вы не вводите подсказку, laravel не знает, какая модель должна быть загружена с этим идентификатором, поэтому он просто передаст id, которые пользователь указал в параметрах запроса.

Измените свой код, чтобы он выглядел так:

// At the top of your controller add a use statement
use App\User;

class UserController extends Controller 
{
    //                    ▼ This is the typehint 
    //                         ▼ The parameter name should be the same resource name used on route
    public function edit(User $usuario)
    { 
        dd($usuario); 
    }
}
person Elias Soares    schedule 03.09.2017
comment
Недостаточно ввести подсказку, переменная name должна совпадать с name параметра. Если нет, вы получите пустой объект пользователя, подобный первому dd($user), отправленному ответчиком. - person dparoli; 04.09.2017
comment
@dparoli это верно. Я обновил ответ. Спасибо. - person Elias Soares; 04.09.2017

Чтобы привязка модели работала в действии контроллера, вы должны использовать имя переменной, соответствующее параметру, который вы используете в объявлении маршрута, попробуйте следующее:

public function edit(User $usuario)

Поскольку в вашем маршруте вы объявили, что используете «usuario» в качестве параметра, привязка модели ищет переменную с тем же именем.

Вы можете проверить имя параметра с помощью php artisan route:list

Это также написано в документах laravel о привязке модели:

Laravel автоматически разрешает модели Eloquent, определенные в маршрутах или действиях контроллера, чьи переменные с указанием типа names соответствуют сегменту маршрута name.

person dparoli    schedule 04.09.2017