Laravel:CRUD路由有一个空参数

时间:2017-01-13 20:26:55

标签: php laravel laravel-5 routes

我遇到CRUD路线问题。在我的控制器UserGroupsController中的方法编辑中,参数$ userGroup为空。

UserGroupsController

class UserGroupsController extends Controller
{
    public function edit(UserGroup $userGroup)
      {        
        if (Auth::check())
        {
          $users = User::pluck('name','id')->all();
          $groups = Group::pluck('name','id')->all();
          return view('users-group.edit', compact('userGroup','users','groups'));
        }else{
          return redirect('login');
        }

    }
}

edit.blade.php

<div class="panel panel-default">
 <div class="panel-heading">Edit</div>
     <div class="panel-body">
          {{ $userGroup }}
          {!! Form::model($userGroup,['method' => 'PATCH', 'route' => ['users-group.update', $userGroup->id], 'id' => 'user_group-form', 'class' => 'form-horizontal'] ) !!}
          {{ csrf_field() }}

          <input type='hidden' name='id' value='{!! $userGroup->id !!}'>
          @include('users-group.form',array('submitButton' => 'Edit User Group'))              
       {!! Form::close()  !!}
</div>

form.blade.php

<div class="form-group">
  <label for="user_id" class="col-md-4 control-label">User</label>
  <div class="col-md-6">
    {!! form::select('user_id', $users, $userGroup->user_id,['class' => 'form-control']) !!}
  </div>
</div>
<div class="form-group">
  <label for="group_id" class="col-md-4 control-label">Group</label>
  <div class="col-md-6">
    {!! form::select('group_id', $groups, $userGroup->group_id,['class' => 'form-control']) !!}
  </div>
</div>
<div class="form-group">
    <div class="col-md-6 col-md-offset-4">
        {!! Form::submit($submitButton) !!}
    </div>
</div>

路线:

Route::group(['middleware'=>['web']], function ()
{
  Route::resource('users','UsersController');
  Route::resource('users-group','UserGroupsController');
  Route::resource('companies','CompaniesController');
});

php artisan route:list:

|        | POST      | users-group                    | users-group.store   | App\Http\Controllers\UserGroupsController@store                        | web          |
|        | GET|HEAD  | users-group/create             | users-group.create  | App\Http\Controllers\UserGroupsController@create                       | web          |
|        | PUT|PATCH | users-group/{users_group}      | users-group.update  | App\Http\Controllers\UserGroupsController@update                       | web          |
|        | DELETE    | users-group/{users_group}      | users-group.destroy | App\Http\Controllers\UserGroupsController@destroy                      | web          |
|        | GET|HEAD  | users-group/{users_group}      | users-group.show    | App\Http\Controllers\UserGroupsController@show                         | web          |
|        | GET|HEAD  | users-group/{users_group}/edit | users-group.edit    | App\Http\Controllers\UserGroupsController@edit

DD($ userGroup表示):

UserGroup {#199 ▼
  #fillable: array:2 [▼
    0 => "user_id"
    1 => "group_id"
  ]
  #connection: null
  #table: null
  #primaryKey: "id"
  #keyType: "int"
  #perPage: 15
  +incrementing: true
  +timestamps: true
  #attributes: []
  #original: []
  #relations: []
  #hidden: []
  #visible: []
  #appends: []
  #guarded: array:1 [▶]
  #dates: []
  #dateFormat: null
  #casts: []
  #touches: []
  #observables: []
  #with: []
  +exists: false
  +wasRecentlyCreated: false
}

在edit.blade.php文件中,我打印变量$ userGroup,但返回&#34; []&#34;。我和UsersControllers有相同的代码,但有效。

当我提交表单时,我收到了这个错误:

MethodNotAllowedHttpException in RouteCollection.php

对不起英语,我希望你能理解我的问题,我可以提供更多信息。感谢

5 个答案:

答案 0 :(得分:3)

这是您的代码中的问题。从php artisan route:list的输出中可以明显看出,参数名称(UserGroupsController中的编辑函数所期望的)是$users_group,而不是$userGroup。因此,我为您提出两个简单的解决方案。

解决方案#1 像这样更改UserGroupsController的编辑功能。

class UserGroupsController extends Controller
{
    public function edit(UserGroup $user_group)
      {        
        if (Auth::check())
        {
          $users = User::pluck('name','id')->all();
          $groups = Group::pluck('name','id')->all();
          return view('users-group.edit', compact('userGroup','users','groups'));
        }else{
          return redirect('login');
        }

    }
}

解决方案2 更改您的路线功能,以便php artisan route:list将其输出。

|        | POST      | users-group                    | users-group.store   | App\Http\Controllers\UserGroupsController@store                        | web          |
|        | GET|HEAD  | users-group/create             | users-group.create  | App\Http\Controllers\UserGroupsController@create                       | web          |
|        | PUT|PATCH | users-group/{userGroup}      | users-group.update  | App\Http\Controllers\UserGroupsController@update                       | web          |
|        | DELETE    | users-group/{userGroup}      | users-group.destroy | App\Http\Controllers\UserGroupsController@destroy                      | web          |
|        | GET|HEAD  | users-group/{userGroup}      | users-group.show    | App\Http\Controllers\UserGroupsController@show                         | web          |
|        | GET|HEAD  | users-group/{userGroup}/edit | users-group.edit    | App\Http\Controllers\UserGroupsController@edit

请注意,users_group必须更改为userGroup

好的,但是为什么?

这是因为Laravel's Implicit Route Binding。 Laravel自动解析在路由或控制器操作中定义的口才模型,这些操作的类型提示变量名称与路由段名称匹配。例如:

Route::get('api/users/{user}', function (App\User $user) {
    return $user->email;
});

由于$user变量的类型提示为App\User雄辩模型,并且变量名称与{user} URI段匹配,因此Laravel将自动注入ID匹配的模型实例来自请求URI的相应值。如果变量名称与{user} URI段不匹配,则Laravel将不会注入任何模型实例,因此该变量将被保留为

答案 1 :(得分:2)

edit方法通常会获得ID。要解决您的问题,请从标题中删除该类型,然后在您的方法中获取模型:

class UserGroupsController extends Controller
{
    public function edit($id)
      {        
        $userGroup = UserGroup::findOrFail($id);
        if (Auth::check())
        {
          $users = User::pluck('name','id')->all();
          $groups = Group::pluck('name','id')->all();
          return view('users-group.edit', compact('userGroup','users','groups'));
        }else{
          return redirect('login');
        }

    }
}

答案 2 :(得分:2)

您无法通过http传递对象。你可以做其中一个:

1-获取id作为输入并找到记录(就像@Daan Meijer所说的那样)。

2-使用路线模型绑定(推荐):Route Model Binding

答案 3 :(得分:0)

通过将变量名$ userGroup更改为$ usergroup(请注意小写字母'G',与资源路由名称匹配)。因此,资源将从数据库返回数据。

在laravel中,传递的路由变量必须与接收的模型或控制器资源匹配

答案 4 :(得分:0)

如果您在数据库中的表名称为 users_group (下划线),则资源路由器应适用于['index','store','show','create ','update','destroy']与

Route::resource('users_group','UserGroupsController');

dd response: #connection: "mysql"

但不

Route::resource('users-group','UserGroupsController');

dd response: #connection: null