Php Laravel 5.5资源控制器和依赖注入
我正在开发Laravel 5.5应用程序。当我使用php artisan make:model SomeModel-mr时,它会创建模型、迁移和资源控制器 我注意到有些方法默认只有一个参数:模型:Php Laravel 5.5资源控制器和依赖注入,php,laravel,laravel-5,dependency-injection,containers,Php,Laravel,Laravel 5,Dependency Injection,Containers,我正在开发Laravel 5.5应用程序。当我使用php artisan make:model SomeModel-mr时,它会创建模型、迁移和资源控制器 我注意到有些方法默认只有一个参数:模型: public function show(SomeModel $someModel) { ... } 如果查看$someModel变量,它有一个空的someModel对象 我在阅读Laravel文档时发现它看起来像容器或立面,但我不知道如何使用它。你知道吗 编辑1: 我在routes/web
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) {});
那么,我应该像这样将每个资源控制器路由替换为手动路由吗?资源控制器希望您使用。在routes文件中,与具有注入模型的控制器操作相对应的每个路由都需要有一个匹配的参数
class UserController extends Controller
{
public function show(User $user)
{
...
}
}
例如:
Route::get('user/{user}', 'UserController@show');
使用上述路由,以下控制器操作将接收与作为URL参数传递的用户ID相对应的用户实例
class UserController extends Controller
{
public function show(User $user)
{
...
}
}
您现在看到一个空模型的原因是,如果没有绑定到路由参数,Laravel只会将新模型传递给控制器。换句话说,如果您忘记在routes文件中绑定模型,则只会给您一个新实例
请注意,如果您使用的是路由资源,则生成的路由应该已经具有正确的参数
Route::resource('users', 'UserController');
您可以运行php artisan route:list来确认实际路由是否正确。资源控制器希望您使用。在routes文件中,与具有注入模型的控制器操作相对应的每个路由都需要有一个匹配的参数
class UserController extends Controller
{
public function show(User $user)
{
...
}
}
例如:
Route::get('user/{user}', 'UserController@show');
使用上述路由,以下控制器操作将接收与作为URL参数传递的用户ID相对应的用户实例
class UserController extends Controller
{
public function show(User $user)
{
...
}
}
您现在看到一个空模型的原因是,如果没有绑定到路由参数,Laravel只会将新模型传递给控制器。换句话说,如果您忘记在routes文件中绑定模型,则只会给您一个新实例
请注意,如果您使用的是路由资源,则生成的路由应该已经具有正确的参数
Route::resource('users', 'UserController');
您可以运行php artisan route:list来确认您的实际路由是否正确。您的问题是您的控制器需要两个参数,如下所示:
public function show($id, User $user)
如果您尝试:
public function show(User $user)
它应该能正常工作
在您的路线中,您只通过一个参数,如:
user/{user}
因此,如果您添加第一个参数,它将显示数字1,但如果您传递该数字
对于模型,它将根据您在路由中传递的id返回相应的用户
用户模型返回空对象的原因是没有向其传递值。
还要确保路由占位符:/{user}与中的变量名匹配
控制器:公共函数showUser$user
希望这有帮助。您的问题是控制器需要两个参数,如下所示:
public function show($id, User $user)
如果您尝试:
public function show(User $user)
它应该能正常工作
在您的路线中,您只通过一个参数,如:
user/{user}
因此,如果您添加第一个参数,它将显示数字1,但如果您传递该数字
对于模型,它将根据您在路由中传递的id返回相应的用户
用户模型返回空对象的原因是没有向其传递值。
还要确保路由占位符:/{user}与中的变量名匹配
控制器:公共函数showUser$user
希望这能有所帮助。我也遇到了同样的问题。 如果您的模型有两个或多个单词,则只需使用像$modeModel这样的小写字母作为$somemodel
public function show(SomeModel $somemodel)
{
...
}
我也遇到了同样的问题。 如果您的模型有两个或多个单词,则只需使用像$modeModel这样的小写字母作为$somemodel
public function show(SomeModel $somemodel)
{
...
}
谢谢你的回复。在我的路由中,它被定义为route::resource'users'、'UserController';因此,例如,当我访问URL user/1时,它应该将路由绑定到操作UserController@show. 我尝试的是在这个方法中加入一个额外的参数:public function show$id,User$User,所以$id是1,它可以工作。但是$user一无所有。@Maramal运行php artisan route:list时会得到什么。您应该注入$id或$user,而不是两者都注入。由于我正在访问该方法,因此它的定义是正确的。但以防万一:users/{user}/|users.edit | App\Http\Controllers\UserController@showI只想使用用户实例,但如果不能,我需要使用id,但我想在之前了解它。@Maramal您的模型名称与路由参数匹配吗?如果路由是users/{user},那么模型类名必须是user,除非您在模型中声明getRouteKeyName方法。Tha
请回答。在我的路由中,它被定义为route::resource'users'、'UserController';因此,例如,当我访问URL user/1时,它应该将路由绑定到操作UserController@show. 我尝试的是在这个方法中加入一个额外的参数:public function show$id,User$User,所以$id是1,它可以工作。但是$user一无所有。@Maramal运行php artisan route:list时会得到什么。您应该注入$id或$user,而不是两者都注入。由于我正在访问该方法,因此它的定义是正确的。但以防万一:users/{user}/|users.edit | App\Http\Controllers\UserController@showI只想使用用户实例,但如果不能,我需要使用id,但我想在之前了解它。@Maramal您的模型名称与路由参数匹配吗?如果路由是users/{user},那么模型类名必须是user,除非您在模型中声明getRouteKeyName方法。当我生成控制器时,它只有一个参数:showUser$user。我试图弄明白,这就是为什么我要给它传递两个参数,但只有一个参数是不起作用的。如果我执行showUser$id,它将向我返回一个空对象。这是不正确的。没有任何东西可以阻止您同时注入原始路由参数和绑定模型。当然,您可以添加任意数量的参数,但请确保将route/user/{user}与模型用户$user匹配,route param占位符应与用于绑定模型的变量名相匹配。@DevinNorgarb我不理解更改公共函数show$id的建议,User$User-to-public函数showUser$User如果路由模型绑定工作正常,那么这两个函数都可以工作。根据我的理解,您将传递路由中的几个参数。然后它看起来像user/{id}/{user}。您确定路由中的占位符与您在控制器中键入的变量名称匹配吗?当我生成控制器时,它只有一个参数:showUser$user。我试图弄明白,这就是为什么我要给它传递两个参数,但只有一个参数是不起作用的。如果我执行showUser$id,它将向我返回一个空对象。这是不正确的。没有任何东西可以阻止您同时注入原始路由参数和绑定模型。当然,您可以添加任意数量的参数,但请确保将route/user/{user}与模型用户$user匹配,route param占位符应与用于绑定模型的变量名相匹配。@DevinNorgarb我不理解更改公共函数show$id的建议,User$User-to-public函数showUser$User如果路由模型绑定工作正常,那么这两个函数都可以工作。根据我的理解,您将传递路由中的几个参数。然后它看起来像user/{id}/{user}。您确定路由中的占位符与您在控制器中键入的变量名称匹配吗?这只是一个示例。。。我不认为这有什么关系,也不认为这是正确的。这是一个错误报告。可以但我没有一个真正的someModel,我只是以它为例。无论如何,谢谢你…这只是一个例子。。。我不认为这有什么关系,也不认为这是正确的。这是一个错误报告。可以但我没有一个真正的someModel,我只是以它为例。无论如何谢谢你。。。