Laravel action() ne ustvari pravilnega url
2 naročnika
2 naročnika
Laravel "helper function" action() ne generirala pravilnega url-ja v primeru create metode.
Zapisano imam na primer
action('KrnekiController@create', [0])
Generira se url...
url_pot?0
Seveda bi lahko zapisal
action('KrnekiController@create', ['id' => 0])
in bi se generiral url...
url_pot?id=0
ampak ni to to. Želim, da se generira takšen url kot ga action() genrira pri vseh ostalih privzetih "resource" metodah s parametri ali pri custom metodah. Vedno se generira pravilni url (url_pot/0) le pri tej privzeti besedi "create" me zajebava.
V routes.php sem definiral pravilni route
Route::get('kr_neki/create/{id}', 'KrnekiController@create');
Route::resource('kr_neki', 'CategoriesController');
Če ne bom našel nobene druge rešitve, pač ne bom uporabil action() ampak bom v *.blade.php ročno zapisal celoten url in potem lepo delujem ampak je potem to spet tako tako, če se kasneje odločim spremeniti url v routes.php moram potem pot spremeniti tudi v blade (lahko bi pa tudi metodo preimenoval in potem deluje ampak to spet ni to).
Id v create metodi nujno potrebujem, ne vem, kako je sicer to v skladu z dobro prakso ampak ga potrebujem.
7 odgovorov
Tole maš nekje drugje napako. Testiral točno tvojo kodo in deluje popolnoma ok. Z "action('KrnekiController@create', ['id' => 0])" dobim "/kr_neki/create/0".
Boš moral kaj več pokazat ali pa raziskat kje drugje imaš napako.
Deluje, če nimam zapisano resource, ampak routes definiram sam.
Recimo, če zapišem
Route::get('kr_neki/create/{id}', 'KrNekiController@create');
Route::resource('kr_neki', 'KrNekiController');
Ne deluje
Če zapišem
Route::get('kr_neki/create/{id}', 'KrNekiController@create');
Route::get('kr_neki/{id}', 'KrNekiController@show');
Route::get('kr_neki/{id}'', 'KrNekiController@destroy');
....
pa deluje :/
Ampak mi je malo mimo, da bi moral zdaj ročno zapisati vse routes samo zato, ker bi rad v create vključil parameter :/
Po moje v prvem primeru ne bi smelo biti težav, ker je Route::get('krneki/create/{id}', 'KrNekiController@create') zapisan nad Route::resource(...) ampak ga očitno ne prepiše. Lahko preveriš, če se tebi zgodi podobno (1. primer -- pod Route::get('krneki/create/{id}', 'KrNekiController@create'); zapišeš še Rote::resource(...))? 2x sem preveril imena in sem vse prav zapisalo tako da mi ni jasno v čem je težava.
čaki čaki to pa malo spremeni.....ti imaš 2 route v isti controller na isti action.
Ne da se mi poganjat vagranta zdele (lahko kasneje zvečer), toda preveri če daš resource kot:
Route::resource('neki', 'NekiController', ['except' => ['create']])
glede na to da definiraš že tam route. Drugače pa oni prvi ruti daj ime ('as' => 'neki') in potem kliči helper route('neki', ['id' => 123])
Odlično, sedaj, ko sem create "vrgel" ven iz resource z except, pa deluje :) Očitno da Laravel prednost resource (v tem primeru ne bere od vrha navzdol v routes.php) in če ima določen Controller tega definiranega, bo najprej pogledal za Action (KrnekiController@create) znotraj resource, dobil URI (krneki/create) in ker ni definiranega {parametra}, kreiral "napačen" url - krneki?id=97, če si prav to razlagam... Sedaj, ko sem to odstranil, pa pravilno pogleda v Route::get('krneki/create/{id}', 'CategoriesController@create'); in seveda generilia pravilen url krneki/97. Super, hvala ti za pomoč :)
Problem je ker si ti določil 2 ruti na 1 action. V tem primeru je šlo po vrsti in ti je resource povozil tvojo.
Laravel v ozadju gradi array, ki ima kot key class@action, in ko ti kličeš action() on ve katera ruta je to. Ker pa si ti imel 2* podan isti action ti je vzel zadnjega (torej resource). Ta pa seveda ni imel idja.
Simpl. ;)
Aha, pa res. Torej tole ne dela tako kot bi želel
Route::get('kr_neki/create/{id}', 'KrnekiController@create');
Route::resource('kr_neki', 'KrnekiController');
če obrnem vrstni red, pa dela :)
Route::resource('kr_neki', 'KrnekiController');
Route::get('kr_neki/create/{id}', 'KrnekiController@create');
Ampak bom raje kar ostal pri except :)