我正在处理一份Laravel5.5的申请。当我使用php artisan make:model SomeModel -mr
时,它创建了模型、迁移和资源控制器。
我注意到在默认情况下,有些方法只有一个参数:模型:
public function show(SomeModel $someModel)
{
...
}
如果查看$someModel
变量,它有一个空的SomeModel对象。
我在阅读Laravel文档,它看起来像容器或正面,但我不知道如何使用这个。你是?
编辑1:
我在路由/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) {});
那么,我是否应该像这样替换所有资源控制器路由到手动路由呢?
发布于 2017-12-03 13:25:30
资源控制器期望您使用路由模型绑定。在您的路由文件中,每个对应于带有注入模型的控制器操作的路由都需要有一个匹配的参数。
例如:
Route::get('user/{user}', 'UserController@show');
使用上述路由,以下控制器操作将接收与作为URL参数传递的用户ID相对应的用户实例。
class UserController extends Controller
{
public function show(User $user)
{
...
}
}
您现在看到一个空模型的原因是,如果不绑定到路由参数,Laravel只会将和新的模型传递给控制器。换句话说,如果您忘记绑定路由文件中的模型,自动注入只会给您一个新的实例。
请注意,如果您正在使用路由资源,则生成的路由应该已经具有正确的参数。
Route::resource('users', 'UserController');
您可以运行php artisan route:list
来确认您的实际路由是否正确。
发布于 2017-12-03 14:26:23
您的问题是控制器需要两个参数,如下所示:
public function show($id, User $user)
如果你尝试:
public function show(User $user)
它应该能正常工作。
在您的路线中,您只经过一个param,如:
user/{user}
因此,如果您第一个参数,它将显示数字1,但如果您传递给模型,它将返回相应的用户,根据您在路由中传递的内容。
User
模型返回空对象的原因是没有传递给它的值。还要确保您的路由占位符:/{user}
匹配控制器:public function show(User $user)
中的变量名。
希望这能有所帮助。
发布于 2017-12-03 20:48:50
我也遇到了同样的问题。如果您的模型有两个或两个以上的单词,您只能使用像$modeModel这样的小写字母作为$somemodel。
public function show(SomeModel $somemodel)
{
...
}
https://stackoverflow.com/questions/47623272
复制