Функция Laravel route() не передает правильный тип контроллеру

#php #laravel #laravel-blade

#php #laravel #laravel-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 AppHttpControllersEmployeesController::edit() must be an instance of AppEmployee, 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');
  

Я пытаюсь сделать приложение многоязычным, поэтому сразу после добавления переменной lang маршрут не будет передавать переменную $employee-> id. Должен ли я добавить переменную, которая передается моему контроллеру для переменной lang?
есть решение? Большое спасибо.

Комментарии:

1. Похоже, что маршрут employee.show принимает 1 параметр, но вы передаете 2 параметра.

2. Да, я должен просто добавить этот параметр в контроллер?

3. Вы можете попробовать изменить свою функцию, чтобы public function edit(Request $request) сообщить мне, если вы получаете другую ошибку

4. Можете ли вы включить свое определение маршрута?

5. Я только что включил его выше.

Ответ №1:

сначала вы можете создать маршрут для изменения языка

 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');
});
  

и вы забываете отправлять язык в каждом маршруте

Комментарии:

1. Я забыл это после make, вы можете использовать @if(Session(‘locale’) == ‘en’) или es или другую аббревиатуру во всех блейдах на языке группы

Ответ №2:

Ваши параметры неверны. Как указано в трассировке стека, метод контроллера ожидает экземпляр вашей 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 предоставленного

Комментарии:

1. Я сделал ваше решение, но оно выдало мне другую ошибку, я не думаю, что $employee отличается от Employee $employee . Ошибка: попытка получить свойство ‘id’ не-объекта (Просмотр: /home/ali/Administration/resources/views/employee/edit.blade.php )

2. @Ali ну, идентификатор не найден в dd() $employee переменной, и посмотрим, что вы получите. также вам может потребоваться перенастроить ваши маршруты,

3. измените свои маршруты в соответствии с @Tanvir Ahmed soultion

Ответ №3:

Я думаю, вам нужно изменить свои маршруты следующим образом

в 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'));
}
  

Комментарии:

1. Я пробовал это, проблема возникает из представления блейда, а не из контроллера. Когда я добавил эту переменную lang в массив <td><a href=»{{ route(’employee.update’, [‘lang’ => app()->getLocale(), ’employee’ => $employee->id]) }}» class=»btn btn-primary»>{{ __(‘app-text.indexEdit’) }}</a></td> Это начало выдает ошибку, когда я удаляю ее, ошибка исчезает, но многоязычность тоже исчезла.

2. хорошо, позвольте мне сначала прояснить одну вещь, почему вам нужно передать getLocale()???….. если вы вызовете ее в своем контроллере, вы также можете получить тот же результат

3. и после использования моего кода, какую ошибку вы получили, вы можете мне показать???

4. Та же ошибка в моем вопросе. Как бы вы вызвали ее из контроллера, если хотите изменить язык с помощью навигационной ссылки?

5. итак, с помощью этих кнопок вы меняете языки??? я прав??

Ответ №4:

если вы также передаете 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'));
}
  

Комментарии:

1. Я включил свои маршруты выше, посмотрите и скажите мне, отличается ли это?

2. вы не можете добавить префикс локали в группу. я также делал это в одном из своих проектов, и это не сработало, поэтому я добавил параметр locale в каждый маршрут, который был единственным решением