Laravel action() ne ustvari pravilnega url

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.

11

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.

Ali si mogoče že v prvo preveril z resource() in ti deluje? :/

(uporabljam Laravel 5.1)

č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])

1

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

1

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 :)