【问题标题】:Too few arguments to function, 0 passed and exactly 1 expected in Laravel函数的参数太少,通过了 0 并且 Laravel 中期望正好 1
【发布时间】:2021-03-29 11:30:01
【问题描述】:

我在 Laravel-5.8 中有一个项目。

'actionURL' => route('appraisal.appraisal_goals.goal_adjustment_self_review', ['id'=>$employeeId]),

从 Notification actionUrl,我将['id'=>$employeeId] 传递到:

public function goal_adjustment_self_review($id)
{      
    $goals = AppraisalGoal::where('employee_id', $id)->whereNull('deleted_at')->get();              
    return view('appraisal.appraisal_goals.goal_adjustment_self_review')->with(['goals' => $goals]);
} 

然后我有这个由goal_adjustment_self_review($id)生成的编辑控制器函数

public function goal_adjustment_edit($id)
{
    $userCompany = Auth::user()->company_id;
    $userId = Auth::user()->employee_id;  
    $goal           =       AppraisalGoal::findOrFail($id); 

    return view('appraisal.appraisal_goals.goal_adjustment_edit')
            ->with('goal', $goal);
}

public function goal_adjustment_update(UpdateAppraisalGoalAdjustmentRequest $request, $id)
{        
    DB::beginTransaction(); 
     try {
     
    $goal = AppraisalGoal::findOrFail($id);
        $goal->goal_type_id             = $request->goal_type_id;
        $goal->weighted_score           = $request->weighted_score;        
            $goal->save();                          
       
        DB::commit(); 
        
            Session::flash('success', 'Goal Setting Weight is updated successfully');
            return redirect()->route('appraisal.appraisal_goals.goal_adjustment_self_review');
    } catch (Exception $exception) {
        Log::error($exception);
             DB::rollback();
             
            Session::flash('error', 'Action failed! Please try again');
            return redirect()->route('appraisal.appraisal_goals.goal_adjustment_self_review');
    }
}

视图:goal_adjustment_edit

<form action="{{route('appraisal.appraisal_goals.goal_adjustment_update', ['id'=>$goal->id])}}" method="post" class="form-horizontal" enctype="multipart/form-data">
  {{ csrf_field() }}
  <input name="_method" type="hidden" value="PUT">

  <div class="card-body">
    <div class="form-body">
      <div class="row">
        <div class="col-12 col-sm-6">
          <div class="form-group">
            <label class="control-label"> Weight(%):<span style="color:red;">*</span></label> <input type="hidden" id="goal_weight_balance" value="0" disabled>
            <input id="total_weighted_score" type="text" name="weighted_score" value="{{old('weighted_score',$goal->weighted_score)}}" placeholder="Enter weighted score here" class="form-control" max="120" onkeyup="checkScore(this.value)">
          </div>
        </div>

      </div>
    </div>
  </div>
  <!-- /.card-body -->
  <div class="card-footer">
    <button type="submit" class="btn btn-primary">Update</button>
  </div>
</form>

路线:

Route::group(['prefix' => 'appraisal', 'as' => 'appraisal.', 'namespace' => 'Appraisal', 'middleware' => ['auth']], function () {
  Route::get('appraisal_goals/goal_adjustment_self_review/{id?}', 'AppraisalGoalsController@goal_adjustment_self_review')->name('appraisal_goals.goal_adjustment_self_review');
  Route::get('appraisal_goals/goal_adjustment_edit/{id?}', 'AppraisalGoalsController@goal_adjustment_edit')->name('appraisal_goals.goal_adjustment_edit');
  Route::put('appraisal_goals/goal_adjustment_update/{id?}', 'AppraisalGoalsController@goal_adjustment_update')->name('appraisal_goals.goal_adjustment_update');
});

当我提交上面的更新表单时,我收到了这个错误:

[2020-12-18 20:10:46] production.ERROR: Too few arguments to function App\Http\Controllers\Appraisal\AppraisalGoalsController::goal_adjustment_self_review(),

0 通过,正好 1 预期

对于这一行:

public function goal_adjustment_self_review($id)

我该如何解决这个问题?

【问题讨论】:

  • 您可以尝试更改方法goal_adjustment_self_review($id = null) 的签名定义,因为您在路由定义中将路由参数作为可选参数。对于任何此类可选路由参数,您还可以通过请求对象或辅助函数(如request()-&gt;route('id'))访问控制器中的值
  • 顺便说一句,您的控制器至少有 1700 行这一事实应该是一个巨大的危险信号。这里有很多浪费的代码(例如,为单个数据库查询运行事务。)您的 URI、方法、类和路由名称也都非常笨拙,导致在尝试理解代码时进行不必要的扫描。 UpdateAppraisalGoalAdjustmentRequest?

标签: php laravel laravel-routing


【解决方案1】:

错误很清楚,您没有将参数传递给方法。该方法由路由引擎调用,这意味着您没有传递您应该传递的路由参数。

您的控制器方法goal_appraisal_update() 包括这一行(出于某种原因两次):

return redirect()->route('appraisal.appraisal_goals.goal_adjustment_self_review');

参数在哪里?


你应该做的是使用route model binding,所以你的控制器方法看起来像这样:

public function goal_adjustment_self_review($employee)
{      
    $goals = $employee->appraisal_goals;             
    return view('appraisal.appraisal_goals.goal_adjustment_self_review')
        ->with('goals', $goals);
} 

public function goal_adjustment_edit(AppraisalGoal $goal)
{
    return view('appraisal.appraisal_goals.goal_adjustment_edit')
        ->with('goal', $goal);
}

public function goal_adjustment_update(UpdateAppraisalGoalAdjustmentRequest $request, AppraisalGoal $goal)
{
    try {
        $goal->update($request->only('goal_type_id', 'weighted_score'));
        Session::flash('success', 'Goal Setting Weight is updated successfully');
    } catch (\Exception $exception) {
        Log::error($exception);
        Session::flash('error', 'Action failed! Please try again');
    }
    return redirect()
        ->route('appraisal.appraisal_goals.goal_adjustment_self_review', $goal);
}

然后可以像这样定义路由:

Route::group(['prefix' => 'appraisal', 'as' => 'appraisal.', 'namespace' => 'Appraisal', 'middleware' => ['auth']], function () {

    Route::get('appraisal_goals/goal_adjustment_self_review/{employee}', 'AppraisalGoalsController@goal_adjustment_self_review')
        ->name('appraisal_goals.goal_adjustment_self_review');

    Route::get('appraisal_goals/goal_adjustment_edit/{goal}', 'AppraisalGoalsController@goal_adjustment_edit')
        ->name('appraisal_goals.goal_adjustment_edit');

    Route::put('appraisal_goals/goal_adjustment_update/{goal}', 'AppraisalGoalsController@goal_adjustment_update')
        ->name('appraisal_goals.goal_adjustment_update');
});

注意路由参数与方法参数的名称相匹配。当在方法签名中声明类型时,奇迹发生了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2020-04-22
    • 2019-07-06
    • 2020-12-11
    • 2020-11-30
    相关资源
    最近更新 更多