Koetan tässä opetella Laravelia (5.1), enkä voi sanoa että ihan heti ymmärtäisin kaikkea. Yritän tehdä ihan perusnäkymää (profile), joka saa GET parametrin arvon 'id' ja tulostaa sen. Eipä sen kummempi kokeilu mutta kun ei toimi. Saa nähdä tuleeko tästä opettelusta mitään :D.
http://localhost:8000/profile/1234
routes.php:
Route::get('/profile/{id}', "profileController@index"); // Route::put('/profile/{id}', "profileController@index");
profileController.php:
namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; //jne... class profileController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index(Request $request) { // tässäkin yritetty kaikenlaista. $id = $request->get('id'); return View::make('profile')->with('id',$id); // return View::make('profile', ['id'=>$id]); } ...
näkymässä profile.blade.php
yritän tulosaa id:n näkyville
<html> >> {{ $id }} <?php echo $id; ?> </html>
tulostus:
>>
Controllerin index-metodissa varmaankin täytyy ottaa parametrinä $id:
public function index($id)
public function index(Request $request, $id)
http://laravel.com/docs/5.1/requests
"If your controller method is also expecting input from a route parameter, simply list your route arguments after your other dependencies. For example, if your route is defined like so:
Route::put('user/{id}', 'UserController@update');
You may still type-hint the Illuminate\Http\Request and access your route parameter id by defining your controller method like the following.."
Juu toimii.
No mutta mitäs sitten kun haluan avata näkymän, jossa kirjoitetaan uusi postaus jonka url olisi muotoa
localhost:8000/posts/create
ja Route on muotoa
Route::get('/post/create', function () { return view('post/create'); });
nythän tuo olettaa että 'create' on 'id'.
vai pitääkö vain luoda URLi joka on eri muotoa, esim /post/newpost
[edit: no ainakin se toimii...]
[edit 2: ekassa esimerkissä profiili, /profile/id mutta tein myös näkymän /post/id myöhemmin, jota siis nyt käytän]
Ei oleta.
Route::get('/profile/{id}', "profileController@index");
Huomaa aaltosulut tuon id:n ympärillä.
tuossa se olettaa että Create on metodi, joka jostain kummansyystä toimii httpGet:nä, urlin ollessa /post/create.
Ensisijaisesti tee näkymä vaikka New, jossa rendataan tyhjä model tietojen täyttöä varten formiin. Tietojen täytön jälkeen submittaat formin postina Createen, josta uudelleenohjaat takaisin vaikka Index -näkymään
meniskös nuo reitit tässätapauksessa esimerkiksi:
Route::get('/profile', "profileController@index"); Route::get('/profile/{id}', "profileController@show"); Route::delete('/profile/{id}', "profileController@delete"); Route::get('/profile/new', "profileController@new"); Route::post('/profile/create', "profileController@create"); Route::get('/profile/edit/{id}', "profileController@edit"); Route::put('/profile/edit/{id}', "profileController@Update");
Eiköhän ala jo riittää tältä perjantailta koodailut, mutta pakko vielä kysyä että kuinka Migratiot tarkalleen ottaen toimivat?
Onko migratio-tiedostojen pakko olla kansiossa tallessa (-\database\migrations)? Oletan että se olisi suotavaa, koska kantaa uudelleenluodessa koodit [migraatiot] suoritetaan järjestyksessä.
Pitääkö aina luoda uusi migraatiotiedosto kun haluaa tehdä muutoksia?
php artisan make:migration add_column_foo_to_users --table=users
tiedosto:
public function up() { Schema::table('users', function (Blueprint $table) { // muutokset tänne }); }
No, jos joku avaisi asiaa ihan suomeksi niin olisi kiva.
Tässä yksi opas mitä selailin: http://daylerees.com/codebright-migrations/
Kannattaa ne migraatiot pitää siinä oikeassa kansiossa. Se on aika looginen paikka niille ja Artisan osaa ne sieltä hakea itse.
Migraatioiden idea on, että et suoraan muuta tietokantaa. Kun yksin kehität niin sillä ei nyt kauheasti ole väliä, mutta jos haluat jonkun toisen (tai itsesi toisella koneella) kehittävän sitä myös, on aika virhealtista ja työlästä muuttaa tietokantaa manuaalisesti. Kun luot migraatiotiedoston, se siirtyy kaikille versionhallinnan kautta ja kaikki voivat turvallisesti päivittää tietokantansa.
Jos muutat vanhaa migraatiotiedostoa, pitää tietokanta nollata ja migraatiot suorittaa alusta. Kun kehität jotain ominaisuutta ei sinun tarvitse uutta migraatiotiedostoa luoda jokaisen tallennuksen jälkeen, mutta pääsääntöisesti silloin kun olet muita tietokantajuttuja tehnyt. Migraatiothan suoritetaan järjestyksessä, joten jos muutat vanhaa migraatiota voit vahingossa rikkoa jonkun muutoksen mitä toisessa tiedostossa yritetään.
Muutama muu huomio:
1. profileController -> ProfileController
2. return View::make('profile') -> return view('profile')
3. RESTful-osoitteet voi luoda resource controllerilla. http://laravel.com/docs/5.1/controllers#restful-resource-controllers
Kannttaa myös käydä kurkkaamassa Laracasts.
@groovyb
Minulla on nyt route:t (vaihdoin profiilin postaukseksi, joita haen kannasta)
Route::get('/post/{id}', "postController@show"); // ... Route::get('/post/create', "postController@create"); // form Route::post('/post/store', "postController@store"); // insert //jne...
Tietääkseni create on näkymää varten, ja store itse tallennsta varten (Insert), sen verran korjaan.
Edelleenkin kun menen selaimella
http://localhost:8000/post/create
menee koodi metodiin 'show', joka puolestaan joko hakee postauksen sillä ID:llä jos se on kannassa, tai ilmoittaa:
{ return view('post.show')->with('post', $post); } else { return 'Postausta ID: <b>'.$id.'</b> ei ole!'; }
Postausta ID: create ei ole!
eli mielestäni koodi tulkitsee sanan 'create' ID:ksi ja kutsuu show()-metodia. miksi koodi ei mene metodiin create, joka puolestaan palauttaisi näkymän jossa luodaan uusi postaus??
Miltä controller näyttää ylläoleville metodeille?
Sinun pitää tietenkin laittaa poikkeustapaukset ensimmäiseksi, koska router poimii ensimmäisen löytämänsä sopivan polun. Tai – mikäli Laravel tukee moista – niin määrittele id-parametri numeeriseksi.
Alchemist on oikeassa, lisää routetaulukon alkuun:
Route::pattern('id', '[0-9]+');
Suosittelen että käytät tuota /post/edit/{id} routea kun editoit jo olemassa olevaa postausta.
Jos olet luonut controllerit artisanin avulla tyyliin:
artisan make:controller postController
niin suurinpiirtein tämmöiset routet ja controllerit on olemassa:
Route::get('/post', "postController@index"); Route::get('/post/{id}', "postController@show"); Route::delete('/post/{id}', "postController@delete"); Route::get('/post/new', "postController@new"); Route::post('/post/create', "postController@create"); Route::get('/post/edit/{id}', "postController@edit"); Route::put('/post/edit/{id}', "postController@Update");
Tuolta Laracast.com:sta katsoin videota ja tuon ongelman voi ratkaista myös laittamalla Route-rivit eri järjestykseen.
p99o kirjoitti:
Tuolta Laracast.com:sta katsoin videota ja tuon ongelman voi ratkaista myös laittamalla Route-rivit eri järjestykseen.
Niinhän minä sanoin.
Ja mikäli jostain syystä haluaa työntää edit-sanan polkuun, niin muotoilisin sen rest-henkisemmin: /post/{id}/edit.
Ai oho, en ollenkaan edes huomannut tuota kommenttia tuossa aiemmin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.