Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Laravel 5.1 - näkymä

Sivun loppuun

p99o [02.12.2015 13:56:09]

#

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:

>>

timoh [02.12.2015 21:39:11]

#

Controllerin index-metodissa varmaankin täytyy ottaa parametrinä $id:

public function index($id)

pevm [04.12.2015 10:33:09]

#

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.."

p99o [04.12.2015 13:24:22]

#

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]

pevm [04.12.2015 14:41:10]

#

Ei oleta.

Route::get('/profile/{id}', "profileController@index");

Huomaa aaltosulut tuon id:n ympärillä.

groovyb [04.12.2015 14:50:24]

#

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

p99o [04.12.2015 16:07:16]

#

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/

Macro [05.12.2015 10:24:17]

#

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.

p99o [06.12.2015 15:16:17]

#

@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??

groovyb [06.12.2015 20:46:41]

#

Miltä controller näyttää ylläoleville metodeille?

The Alchemist [06.12.2015 23:52:57]

#

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.

groovyb [07.12.2015 08:14:09]

#

Alchemist on oikeassa, lisää routetaulukon alkuun:

Route::pattern('id', '[0-9]+');

pevm [07.12.2015 09:24:01]

#

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

p99o [14.12.2015 14:06:06]

#

Tuolta Laracast.com:sta katsoin videota ja tuon ongelman voi ratkaista myös laittamalla Route-rivit eri järjestykseen.

The Alchemist [14.12.2015 21:15:58]

#

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.

p99o [16.12.2015 11:53:03]

#

Ai oho, en ollenkaan edes huomannut tuota kommenttia tuossa aiemmin.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta