Laravel route() 函数没有将正确的类型传递给控制器

Laravel route() function doesn't pass the right type to the controller

blade代码:

<td><a href="{{ route('employee.show', ['lang' => app()->getLocale(), 'employee' => $employee->id]) }}">{{ $employee->first_name }} {{ $employee->last_name }}</a></td>
                                <td><a href="{{ route('employee.update', ['lang' => app()->getLocale(), 'employee' => $employee->id]) }}" class="btn btn-primary">{{ __('app-text.indexEdit') }}</a></td>
                                <td><form action="{{ route('employee.delete', ['lang' => app()->getLocale(), 'employee' => $employee->id]) }}" method="post">

控制器功能:

public function edit(Employee $employee)
{
    $companies = Company::get();
    return view('employee.edit', compact('employee', 'companies'));
}

错误:

TypeError
Argument 1 passed to App\Http\Controllers\EmployeesController::edit() must be an instance of App\Employee, string given
http://localhost:8000/fr/employee/edit/1

路线:

Route::group(['prefix' => '{lang}'], function() {

    Route::prefix('employee')->name('employee.')->group(function() {
        
        Route::get('/edit/{employee}', 'EmployeesController@edit')->name('edit');
        Route::patch('/edit/{employee}', 'EmployeesController@update')->name('update');

我正在尝试使应用程序成为 multi-language 应用程序,因此在我添加 lang 变量之后,路由不会传递 $employee->id 变量。我应该为 lang 变量添加一个可传递给我的控制器的变量吗? 任何解决方案?非常感谢。

你的参数有误。正如堆栈跟踪所说,控制器方法需要一个 Employee 模型的实例,但您传入的是一个字符串

改变

public function edit(Employee $employee)

public function edit(Request $request, $employeeId) // you can remove $request if you dont intend to perform redirects

所以最后你的代码看起来像

public function edit(Request $request, $employeeId)
{
  $employee = Employee::find($employeeId);
  $companies = Company::all(); // use all instead of get if you arent going to perform selections.
  return view('employee.edit', compact('employee', 'companies'));
}

注意:您可能需要根据提供的$employeeId

处理找不到员工的情况

我认为你必须像这样修改你的路线

在web.php

Route::get('your-route/{lang}/{id}','YourController@edit');

在您的控制器中

public function edit($lang,Employee $employee)
{
    $companies = Company::get();
    return view('employee.edit', compact('employee', 'companies'));
}

如果您在路线中也经过 locale 那么它应该如下所示:

web.php

Route::get('your-Own-route/{lang}/{employee}','YourController@edit');

控制器编辑方法

public function edit($lang,Employee $employee)
{
    $companies = Company::get();
    return view('employee.edit', compact('employee', 'companies'));
}

首先你可以创建一个路由来更改语言

Route:: get('lang/{lang}', function ($locale) {
    session(['locale' => $locale]);
    return \Redirect::back();
})

第 2 步:中间件

public function handle($request, Closure $next)
    {
        App::setLocale(session('locale'));
        return $next($request);
    }

可以组群后

Route::group(['middleware' => 'language'],function(){
    //routes with u want change language
    Route::get('/edit/{employee}', 'EmployeesController@edit')->name('edit');
    Route::patch('/edit/{employee}', 'EmployeesController@update')->name('update');
});

而且您忘记在每条路线中发送语言