【问题标题】:Laravel: CRUD route has a empty parameterLaravel:CRUD 路由有一个空参数
【发布时间】:2017-05-29 07:35:41
【问题描述】:

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

用户组控制器

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 工匠路线:列表:

|        | 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,但返回“[ ]”。而且我对 UsersControllers 有相同的代码,但是可以工作。

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

MethodNotAllowedHttpException in RouteCollection.php

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

【问题讨论】:

  • 通常,您将id 作为控制器方法的参数。
  • 嗨,我更新了帖子,我放了 dd($userGroup);。变量为空:(
  • 你在尝试哪个网址?

标签: php laravel laravel-5 routes


【解决方案1】:

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】:

    这是您的代码中的问题。从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 自动解析定义在路由或控制器操作中的 Eloquent 模型,其类型提示的变量名称与路由段名称匹配。例如:

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

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

    【讨论】:

      【解决方案3】:

      您不能通过 http 传递对象。您可以执行以下任一操作:

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

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

      【讨论】:

      • @DaanMeijer。是的。你会喜欢的
      【解决方案4】:

      通过将变量名$userGroup改成$usergroup(注意小写'G',匹配资源路由命名)。所以资源从数据库返回数据。

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

      【讨论】:

        【解决方案5】:

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

        Route::resource('users_group','UserGroupsController');
        
        dd response: #connection: "mysql"
        

        但不是

        Route::resource('users-group','UserGroupsController');
        
        dd response: #connection: null
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-09-29
          • 2012-10-11
          • 1970-01-01
          • 2023-04-08
          • 2016-06-16
          • 1970-01-01
          • 2022-01-17
          相关资源
          最近更新 更多