我正在开发Laravel 5.5应用程序。当我使用php artisan make:model SomeModel -mr
时,它会创建模型,迁移和资源控制器。
我注意到一些方法默认只有一个参数:模型:
public function show(SomeModel $someModel)
{
...
}
如果你查看$someModel
变量,它有一个空的 SomeModel 对象。
我正在阅读Laravel文档,它看起来像容器或外墙,但我不知道如何使用它。你呢?
修改1:
我在routes / web.php中定义了我的路由:Route::resource('users', 'UserController');
现在我必须手动定义所有路由,因为自动绑定不起作用:
Route::get('users', 'UserController@index');
Route::get('users/create', 'UserController@create');
Route::post('users', 'UserController@store');
Route::get('users/{user}/edit', 'UserController@edit', function(App\User $user) {});
Route::post('users/{user}', 'UserController@update', function(App\User $user) {});
Route::post('users/{user}/delete', 'UserController@destroy', function(App\User $user) {});
那么,我应该像这样将每个资源控制器路由替换为手动路由吗?
答案 0 :(得分:4)
资源控制器希望您使用route model binding。在您的路径文件中,与具有注入模型的控制器操作对应的每个路径都需要具有匹配的参数。
例如:
Route::get('user/{user}', 'UserController@show');
使用上述路由,以下控制器操作将接收与作为URL参数传递的用户ID相对应的用户实例。
class UserController extends Controller
{
public function show(User $user)
{
...
}
}
你现在看到一个空模型的原因是Laravel只是将新模型传递给控制器,如果它没有绑定到路由参数。换句话说,如果您忘记在路径文件automatic injection中绑定模型,则只会为您提供一个新实例。
请注意,如果您使用的是路径资源,则生成的路径应该已经具有正确的参数
Route::resource('users', 'UserController');
您可以运行php artisan route:list
以确认您的实际路线是否正确。
答案 1 :(得分:2)
您的问题是您的控制器需要两个参数,如下所示:
public function show($id, User $user)
如果您尝试:
public function show(User $user)
它应该可以正常工作。
在您的路线中,您只传递一个参数:
user/{user}
因此,如果您输入第一个参数,它将显示数字1,但如果您通过该数字 对于模型,它将根据您在路径中传递的ID返回相应的用户。
您的User
模型返回空对象的原因是因为没有传递给它的值。
还要确保您的路径占位符:/{user}
与变量名称匹配
控制器:public function show(User $user)
。
希望这有帮助。
答案 2 :(得分:0)
我也遇到了同样的问题。 如果您的模型有两个或更多单词,则必须使用$ modeModel这样的小写字母作为$ somemodel。
public function show(SomeModel $somemodel)
{
...
}