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

Кодът на острието:

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

Опитвам се да направя приложението многоезично, така че точно след като добавих променливата lang, маршрутът няма да премине променливата $employee-›id. Трябва ли да добавя променлива, която може да премине към моя контролер за променливата lang? някакво решение? Много благодаря.


person Ali    schedule 25.08.2020    source източник
comment
Изглежда, че маршрутът employee.show приема 1 параметър, но вие предавате 2 параметъра.   -  person sta    schedule 25.08.2020
comment
Да, трябва ли просто да добавя този параметър към контролера?   -  person Ali    schedule 25.08.2020
comment
Можете да опитате да промените функцията си на public function edit(Request $request) кажете ми, ако получите друга грешка   -  person sta    schedule 25.08.2020
comment
Можете ли да включите дефиницията на вашия маршрут?   -  person DigitalDrifter    schedule 25.08.2020
comment
Просто го включих по-горе.   -  person Ali    schedule 25.08.2020
comment
Можем, работи с други връзки. Проблемът е в масива, който предавам на контролера, той може би променя типа на $employee-›id на низ или друго нещо, което не мога да разбера   -  person Ali    schedule 25.08.2020


Отговори (4)


първо можете да направите маршрут за промяна на езика

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

и забравяте да изпратите езика във всеки маршрут

person Luis Aguilar    schedule 25.08.2020
comment
Забравих го, след като make можете да използвате @if(Session('locale') == 'en') или es или друг акроним, в целия език на групата - person Luis Aguilar; 25.08.2020

Вашите параметри са грешни. Както казва трасирането на стека, методът на контролера очаква екземпляр на вашия Employee модел, но вие предавате низ

промяна

public function edit(Employee $employee)

To

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

person Ainz-sama    schedule 25.08.2020
comment
Направих вашето решение, но ми даде друга грешка. Не мисля, че $employee е различно от Employee $employee. Грешката: Опит за получаване на свойство „id“ на не-обект (Преглед: /home/ali/Administration/resources/views/employee/edit.blade.php) - person Ali; 25.08.2020
comment
@Ali добре, идентификаторът не се намира dd() променливата $employee и вижте какво получавате. също може да се наложи да преконфигурирате маршрутите си, - person Ainz-sama; 25.08.2020
comment
променете маршрутите си според @Tanvir Ahmed soultion - person Ainz-sama; 25.08.2020

Мисля, че трябва да промените маршрутите си като тези

в 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'));
}
person Tanvir Ahmed    schedule 25.08.2020
comment
Опитах това, проблемът идва от изгледа на острието, а не от контролера. Когато добавих тази lang променлива към масива ‹td›‹a href={{ route('employee.update', ['lang' =› app()-›getLocale(), 'employee' =› $employee-› id]) }} class=btn btn-primary›{{ __('app-text.indexEdit') }}‹/a›‹/td› Започна да дава грешка, когато го премахна грешката изчезна, но многоезичното нещо също го няма. - person Ali; 25.08.2020
comment
добре, нека първо да изясня едно нещо защо трябва да подадете getLocale()???.....ако го извикате във вашия контролер, можете да получите същия резултат - person Tanvir Ahmed; 25.08.2020
comment
и след като използвате моя код, каква грешка получавате, можете ли да ми покажете??? - person Tanvir Ahmed; 25.08.2020
comment
Същата грешка в моя въпрос. Как ще го извикате от контролера, когато искате да промените езика чрез навигационна връзка? - person Ali; 25.08.2020
comment
така че с тези бутони сменяте езиците???прав ли съм?? - person Tanvir Ahmed; 25.08.2020
comment
Да, и кодът на блейда за това е: ‹li class=nav-item› ‹a href={{ route(Route::currentRouteName(), 'en') }} class=nav-link›En‹/a› ‹/li› ‹li class=nav-item› ‹a href={{ route(Route::currentRouteName(), 'fr') }} class=nav-link›FR‹/a› ‹/li› Това ' en' и 'fr' са аргументите, предадени на променливата {lang} в маршрута - person Ali; 25.08.2020
comment
href={{ route('employee.update', ['lang' =› app()-›getLocale(), 'employee' =› $employee-›id]) }} 'lang' тук е низът, който се предава на функцията за редактиране, но аз искам да предам „служителя“ - person Ali; 25.08.2020

ако преминавате и 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'));
}
person Naveed Ali    schedule 25.08.2020
comment
Включих моите маршрути по-горе, погледнете и ми кажете различно ли е? - person Ali; 25.08.2020
comment
не можете да добавите локален префикс в групата. аз също го направих в един от моите проекти и той не работи, така че добавих локалния параметър във всеки маршрут, което беше единственото решение - person Naveed Ali; 25.08.2020