/* |-------------------------------------------------------------------------- | 0. Linkkejä |-------------------------------------------------------------------------- */ https://www.flynsarmy.com/2015/02/creating-a-basic-todo-application-in-laravel-5-part-1/ https://laracasts.com/series/laravel-5-fundamentals/episodes/4?autoplay=true https://laravel.com/docs/5.3/installation https://laravel.com/docs/5.3/controllers https://laravel.com/docs/5.3/blade /* |-------------------------------------------------------------------------- | 1. Laravel-asennus Ubuntu Server 16.04.1 LTS -järjestelmään |-------------------------------------------------------------------------- */ * Haetaan: Ubuntu-Server 16.04.1 (iso-image) * Asennetaan VBOX-koneeseen (2GB RAM, 10GB LVM-levyä) * ssh-palvelin asennettu (rastitettu) asennuksen yhteydessä. * Network:Bridget * User: testi/root66 * Asennuksen jälkeen sudo apt-get update sudo apt-get upgrade --- // Asennetaan riittävän uusi PHP: sudo apt-get install python-software-properties sudo add-apt-repository ppa:ondrej/php // Ja otetaan edellinen käyttöön: sudo apt-get update sudo apt-get install php5.6 php5.6-mcrypt php5.6-gd sudo phpenmod mcrypt // Tämä on turhaa tässä konfiguraatiossa (mutta ei kaikissa), // tullut jo asennettua riippuuvksien kautta edellä: sudo apt-get install apache2 libapache2-mod-php5.6 // GIT tarvitaan Composeria varten, serverUbuntussa tämäkin on jo valmiina, mutta ei Desktopissa sudo apt-get install git // Asennetaan Composer: curl -sS https://getcomposer.org/installer | php5.6 sudo mv composer.phar /usr/local/bin/composer // Asennetaan muutama Laravelin tarvitsema PHP:n tarvitsema apukirjasto: sudo apt-get install php5.6-mbstring sudo phpenmod mbstring sudo apt-get install php5.6-xml sudo apt-get install zip sudo apt-get install php5.6-zip // Asennetaan tietokantapalvelin valmiiksi // Anna tietokantapalvelimen pääkäyttäjän "root" salasanaksi "sala", // kun asennusohjelma sitä kysyy: // New password for the MySQL "root" user: sudo apt-get install mysql-server // Asennetaan mysqlin php-pdo-driver, jotta tietokantaa voi käsitellä php:llä sudo apt-get install php5.6-mysql // Asennetaan itse Laravel: cd /var/www/html sudo composer create-project laravel/laravel laraproject --prefer-dist Tämä päättyy tähän: ... Application key [base64:btvp4PzjcspdsCyPY7Mwe61VXl0B/xZOuy+4QaMkuuY=] set successfully. sudo chgrp -R www-data /var/www/html/laraproject sudo chmod -R 775 /var/www/html/laraproject/storage cd /etc/apache2/sites-available sudo nano laravel.conf -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ServerName localhost ServerAdmin webmaster@localhost DocumentRoot /var/www/html/laraproject/public AllowOverride All ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- sudo a2dissite 000-default.conf sudo a2ensite laravel.conf sudo a2enmod rewrite sudo service apache2 restart Sitten vaan selaimeen http://localhost/ tai http://palveilmenip ja ihailemaan onnistunutta Laravel-asennusta. DONE! /* |-------------------------------------------------------------------------- | 2. Laravel-asennus public_html-kansioon |-------------------------------------------------------------------------- */ ENSIN: Kotikansiot käyttöön: sudo a2enmod userdir Sitten salli php käyttäjien kotikansioista: sudo nano /etc/apache2/mods-enabled/php5.6.conf Eli kommentoi seuraava rivi: # php_admin_flag engine Off sudo service apache2 restart Kotikansioon: cd // Jos on, niin poista ensin: sudo rm -rf .config/ sudo rm -rf .composer/ curl -sS https://getcomposer.org/installer | php (tekee vain .config-kansion, vaikka .composer-kansion olemassaollessa valittaa siitä?) sudo mv composer.phar /usr/local/bin/composer (tuskin tätä olisi tarvinnut enää?) // Asennetaan composerilla Laravelin installer: composer global require "laravel/installer=~1.1" (jotta onnistui, piti poistaa TAI nimetä uudelleen rootin omistuksessa oleva .composer-kansio) // teki siis itselleen vastaavan ~/.config-kansion. mkdir public_html cd public_html //////////////////////////////////////////////////// Tällaisen muutoksen tein myös 22.10.2017 laravelin versiota varten, tuskin tätä lopulta tarvitsi: more /home/testi/.config/composer/composer.json { "require": { "laravel/installer": "~1.1", "laravel/framework": "5.3.*" } } //////////////////////////////////////////////////// composer create-project laravel/laravel l5todo --prefer-dist Installing laravel/laravel (v5.4.30) - Installing laravel/laravel (v5.4.30): Downloading (100%) ... > php artisan optimize Generating optimized class loader The compiled services file has been removed. > php artisan key:generate Application key [base64:7hbwGCmJoZ/tnW3KikX5RYvxzWTMLSBG4dKcdzHW6kw=] set successfully. testi@ubuntu:~/public_html$ /////// VANHA VERSIO, TÄMÄ EI TOIMI ENÄÄÄ?////////// //////////////////////////////////////////////////// ~/.config/composer/vendor/bin/laravel new l5todo // PÄÄTTYY RIVEIHIN: > php artisan key:generate Application key [base64:rjlGVhTJ/BMPKVC2mWICKuznX0aN3Eqr93Mtf7qsx58=] set successfully. Application ready! Build something amazing. //////////////////////////////////////////////////// /////// VANHA VERSIO, TÄMÄ EI TOIMI ENÄÄÄ?////////// // Käynistetään php:n mukana tuleva devaus-web-palvelin TCP-porttiin 8888 // dokumenttijuurena public/-kansio cd ~/public_html/l5todo php5.6 -S 192.168.1.167:8888 -t public/ Sitten vaan selaimeen http://192.168.1.167:8888/ ja ihailemaan toista onnistunutta Laravel-asennusta. DONE! /* |-------------------------------------------------------------------------- | 3. public_html-kansioon asennetun Laravelin ajaminen Apachella |-------------------------------------------------------------------------- */ Huom: Tässä esitetty vain yksi tapa alkuun pääsemiseksi Jos haluat ajaa Laraveliä jo asennetun Apache-web-palvelimen kautta, niin tee seuraavat konfiguraatiomuutokset: A. Aseta Apachen DocumentRoot osoittamaan Laravelin public-kansioon: sudo nano /etc/apache2/sites-available/laravel.conf -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ServerName localhost ServerAdmin webmaster@localhost DocumentRoot /home/testi/public_html/l5todo/public # DocumentRoot /var/www/html/laraproject/public # AllowOverride All ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- B. Aseta Apache toimimaan testi-käyttäjänä, jotta Apachella olisi oikeus muokata Laravelin storage- ja bootstarp/cache-kansion tiedostoja. (Tässä tehdään näin, että voidaan käyttää tarvittaessa rinnakkain myös php-tulkilla TCP-porttiin 8888 käynnistettyä web-palvelinta) sudo nano /etc/apache2/envvars -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ... #export APACHE_RUN_USER=www-data #export APACHE_RUN_GROUP=www-data export APACHE_RUN_USER=testi export APACHE_RUN_GROUP=testi ... -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- C. Käynnistä web-palvelin uudelleen sudo service apache2 restart D. Testaa: Selaimeen http://192.168.1.167/ ja ihailemaan toista onnistunutta Laravel-asennusta toisesta näkökulmasta DONE! /* |-------------------------------------------------------------------------- | 4. Linux-tiedostot Windowsin FileExploreriin: Samban asentaminen |-------------------------------------------------------------------------- */ * Tämä ei ole pakollinen, mutta helpottaa Ubuntu-serverin tiedostojen käsittelyä. // Asennetaan sudo apt-get install samba samba-client // Luodaan samba-käyttäjä, anna salasanaksi root66 sudo smbpasswd -a testi // Jaa käyttäjän kotikansio: sudo nano /etc/samba/smb.conf resources/views/welcome.blade.php ----------------------------------------------> ... [homes] comment = Home Directories valid users = %S browseable = no read only = No guest ok = no ... // Käynnistä Samba uudelleen: sudo service smbd restart sudo service nmbd restart // Windowsin FileExplorerissa: Map Network Drive \\192.168.50.SUN-IKIOMA-LINUXIN-IP\testi -> Anna tunnukseksi testi/root66 /* |-------------------------------------------------------------------------- | 5. Laravelin hakemistopuu |-------------------------------------------------------------------------- */ http://netisto.fi/laravel/laravel-dir-tree.png http://netisto.fi/laravel/laravel-dir-tree-v2.png /* |-------------------------------------------------------------------------- | 6. "Haloo Laravel"-teksti kansisivulle |-------------------------------------------------------------------------- */ routes/web.php ----------------------------------------------> Route::get('/', function () { return view('welcome'); }); resources/views/welcome.blade.php ----------------------------------------------> ...
Haloo Laravel
... Selain: http://192.168.1.167/ ----------------------------------------------> Tulostuu Haloo Laravel Huom: Ei käytä kontrolleria. Route->View (nk. "closure") /* |-------------------------------------------------------------------------- | 7. Oma contact-template |-------------------------------------------------------------------------- */ routes/web.php ----------------------------------------------> ... Route::get('contact', function () { return view('contact'); }); Luo tiedosto: resources/views/contact.blade.php ---------------------------------------------->

Contact Me Arska

/* |-------------------------------------------------------------------------- | 8. Oma Contact2-kontrolleri |-------------------------------------------------------------------------- */ 8.0 Luodaan reitit tiedostoon: routes/web.php ----------------------------------------------> ... Route::get('contact2', 'Contact2Controller@showinfo'); Route::get('contact21', 'Contact2Controller@returninfo'); Route::get('viewfromfolder', 'Contact2Controller@viewfromfolder'); Route::get('viewfromfolder2', 'Contact2Controller@viewfromfolder2'); 8.1 Luodaan kontrolleri metodein: app/Http/Controllers/Contact2Controller.php ---------------------------------------------->

Contact2Controller / ShowInfo-method / contact2-view

8.1.2 Selain: http://192.168.1.167/contact2 Tulostuu "

Contact2Controller / ShowInfo-method / contact2-view

" 8.2 Testataan myös contact21-reitti eli kontrollerin returninfo()-funktion palauttama sisältö (ei siis näkymää) Selain: http://192.168.1.167/contact2 Tulostuu: "Controllerin return-lause" 8.3 Näkymät alikansioista: 8.3.1 Luodaan kansio; resources/views/kansio 8.3.2 Luodaan näkymä: resources/views/kansio/contact2.blade.php ---------------------------------------------->

Terveisia kansiosta

Testataan: Selain: http://192.168.1.167/viewfromfolder Tulostuu: "

Terveisia kansiosta

" 8.3.3 Luodaan näkymä: resources/views/kansio/contact3.blade.php ---------------------------------------------->

Terveisia kansiosta pistenotaatiolla

Testataan: Selain: http://192.168.1.167/viewfromfolder2 Tulostuu: "

Terveisia kansiosta pistenotaatiolla

" /* |-------------------------------------------------------------------------- | 9. artisan-skripti / oman kontrollerin luominen |-------------------------------------------------------------------------- */ HUOM: "php artisan"-komento pitää antaa työhakemistona se laravel-projektikansio, mihin projektiin sen halutaan vaikuttavan. Helppiä artisaniin tarvittaessa: php artisan make:controller --help Kontrollerin tekeminen: php artisan make:controller PagesController ---> No niin siitä tulee vaan lähes tyhjä kontrolleritiedosto. Ainut hyöty taitaa olla se, namespace- ja use-viittaukset ovat oikein käytetylle Laravelin versiolle ja ympäristölle. /* |-------------------------------------------------------------------------- | 10. Datan välittäminen kontrollerilta view:lle / OSA1 |-------------------------------------------------------------------------- */ 10.0 Lisätään pari reittiä: routes/web.php ----------------------------------------------> Route::get('about', 'PagesController@about'); Route::get('about2', 'PagesController@about2'); 10.1 Muokataan: app/Http/Controllers/PagesController.php ----------------------------------------------> Raaka-Arska"; // return 'About Page'; return view('pages.about')->with('name', $name); } public function about2() { $people = []; $people[] = 'Raaka'; $people[] = 'Arska'; $data = []; $data['first'] = 'Raaka'; $data['last'] = 'Arska'; return view('pages.about2')->with('people', $people); /* TAI NÄIN: return view('pages.about2')->with([ 'first' => 'Raaka', 'last' => 'Arska' ]); */ } } 10.2 Luodaan näkymä: resources/views/pages/about.blade.php ---------------------------------------------->

Name by PHP-syntax:

Names by Laravel Blade Templating Syntax:

{{ name }} : {{ $name }}

{!! name !!} : {!! $name !!}

PagesController/about-method

10.3 Selaimeen: Selain: http://192.168.1.167/about 10.4: Selitä itsellesi, mitä tapahtui. /* |-------------------------------------------------------------------------- | 11. Datan välittäminen kontrollerilta view:lle / OSA2 |-------------------------------------------------------------------------- */ 11.0 Kontrolleri tehtiin jo kohdassa 10.1 11.1 Luodaan näkymä, jonka sektiot 'content' ja 'footer' tulostetaan views-kansiossa olevaan "master-leiskaan" eli app.plade.php-templateen sinne merkityille paikoille: resources/views/pages/about2.blade.php ----------------------------------------------> @extends('app') @section('content') @if (count($people))

People I Like:

@endif

{{-- $first --}} - {{-- $last --}}

PagesController/about2-method

@stop @section('footer') © Ari Rantala 2016 @stop 11.2 JA tehdään "master-template": resources/views/app.blade.php ----------------------------------------------> Eka Laravel-template

Eka Laravel-template


@yield('content')
@yield('footer') 11.3: Selitä itsellesi, mitä tapahtui. /* |-------------------------------------------------------------------------- | 12. Tietrokannan käsittely eli: Tietokantamigraatiot |-------------------------------------------------------------------------- */ 12.1 Luodaan homestead-niminen tietokanta: mysql -u root -psala mysql> create database homestead; Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | homestead | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql> exit DONE! 12.2 Määritellään Laravel käyttämään noita tietokantayhteystietoja ja luotua tietokantaa. .env ----------------------------------------------> DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=homestead DB_USERNAME=root DB_PASSWORD=sala 12.3 Luodaan enempiä selittelemättä database/migrations-kansion php-skriptien määritysten mukaan ja tietokantayhteysmäärittelyjen mukaan php artisan migrate Migration table created successfully. Migrated: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_100000_create_password_resets_table 12.4 Tutkitaan tietokantaa: mysql -u root -psala homestead --- --- --- -- mysql> select * FROM migrations; +----+------------------------------------------------+-------+ | id | migration | batch | +----+------------------------------------------------+-------+ | 1 | 2014_10_12_000000_create_users_table | 1 | | 2 | 2014_10_12_100000_create_password_resets_table | 1 | +----+------------------------------------------------+-------+ 2 rows in set (0.00 sec) mysql> desc users; +----------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(255) | NO | | NULL | | | email | varchar(255) | NO | UNI | NULL | | | password | varchar(255) | NO | | NULL | | | remember_token | varchar(100) | YES | | NULL | | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | +----------------+------------------+------+-----+---------+----------------+ 7 rows in set (0.00 sec) mysql> desc password_resets; +------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+-------+ | email | varchar(255) | NO | MUL | NULL | | | token | varchar(255) | NO | MUL | NULL | | | created_at | timestamp | YES | | NULL | | +------------+--------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) 12.5 Luodaan uusi migraatio: php artisan make:migration create_articles_table --create="articles" Created Migration: 2016_11_06_185827_create_articles_table 12.6 Muokataan luotua migraatiota: nano 2016_11_06_185827_create_articles_table.php ... public function up() { Schema::create('users', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->text('body'); $table->timestamps(); $table->timestamp('published_at')->useCurrent(); }); } ... 12.7 Ajetaan migraatio tietokantaan: php artisan migrate Migrated: 2016_11_06_185827_create_articles_table Tutki tulos tietokannasta: mysql -u root -psala homestead mysql> desc articles; +--------------+------------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+------------------+------+-----+-------------------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | title | varchar(255) | NO | | NULL | | | body | text | NO | | NULL | | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | | published_at | timestamp | NO | | CURRENT_TIMESTAMP | | +--------------+------------------+------+-----+-------------------+----------------+ 6 rows in set (0.00 sec) mysql> select * FROM articles; Empty set (0.00 sec) /* |-------------------------------------------------------------------------- | 13. ELOQUENT-ORM: https://laravel.com/docs/5.3/eloquent#introduction |-------------------------------------------------------------------------- */ 13.1 Luodaan uusi malli php artisan make:model Article Model created successfully. (Syntyy model: app/Article.php) 13.2 Populoidaan tietokantaa edellä luodon mallin kautta tinkerillä: php artisan tinker Psy Shell v0.7.2 (PHP 5.6.27-1+deb.sury.org~xenial+1 — cli) by Justin Hileman >>> $name = "Ari"; => "Ari" >>> $name; => "Ari" >>> $article = new App\Article; => App\Article {#671} >>> $article; => App\Article {#671} >>> $article->title = 'My First Article'; => "My First Article" >>> $article->body = 'Lorem Ipsum'; => "Lorem Ipsum" >>> $article; => App\Article {#671 title: "My First Article", body: "Lorem Ipsum", } >>> $article->toArray(); => [ "title" => "My First Article", "body" => "Lorem Ipsum", ] >>> $article->save(); => true >>> App\Article::all()->toArray(); => [ [ "id" => 1, "title" => "My First Article", "body" => "Lorem Ipsum", "created_at" => "2016-11-06 19:38:18", "updated_at" => "2016-11-06 19:38:18", "published_at" => "2016-11-06 21:38:18", ], ] >>>exit Exit: Goodbye. mysql -u root -psala homestead select * from articles; +----+------------------+-------------+---------------------+---------------------+---------------------+ | id | title | body | created_at | updated_at | published_at | +----+------------------+-------------+---------------------+---------------------+---------------------+ | 1 | My First Article | Lorem Ipsum | 2016-11-06 19:38:18 | 2016-11-06 19:38:18 | 2016-11-06 21:38:18 | +----+------------------+-------------+---------------------+---------------------+---------------------+ 1 row in set (0.00 sec) 13.3 HUOM: JOS tinkerin ON SAMMUTTANUT JA SITTEN KÄYNNISTÄNYT UUDELLEEN JA JA HALUAA ESIM PÄIVITTÄÄ ARTICLEA, NIIN ensin pitää ladata article, esim näin: php artisan tinker >>> $article = App\Article::find(1); => App\Article {#687 id: 1, title: "My First Article", body: "Lorem Ipsum", created_at: "2016-11-06 19:38:18", updated_at: "2016-11-06 19:38:18", published_at: "2016-11-06 21:38:18", } >>> $article->title = 'My Updated First Article'; => "My Updated First Article" >>> $article->save(); => true >>> $article->toArray(); => [ "id" => 1, "title" => "My Updated First Article", "body" => "Lorem Ipsum", "created_at" => "2016-11-06 19:38:18", "updated_at" => "2016-11-06 19:45:30", "published_at" => "2016-11-06 21:38:18", ] >>>exit 13.4 KÄYNNISTETÄÄN TINKER UUDESTAAN JA LISÄTÄÄN UUSI ARTIKKELI JA VÄHÄN PÄIVITELLÄÄN SITÄ php artisan tinker YRITETÄÄN LISÄTÄ USEAN KENTÄN ARVO YHTÄAIKAA: >>> $article = App\Article::create(['title' => 'New Article', 'body' => 'New body']); Illuminate\Database\Eloquent\MassAssignmentException with message 'title' => EI ONNISTU, PITÄÄ LISÄTÄ TIEDOSTOON app/Article.php eli artikkelin modeliin: class Article extends Model { protected $fillable = [ 'title', 'body' ]; } jotta näiden kenttien massassignment onnistusi. Kun muutoksen tekee tiedostoon ja tallentaa, niin ainakin minä jouduin sammuttamaan ja käynnistämään tinkerin uudelleen: >> exit Exit: Goodbye. php artisan tinker SITTEN ONNISTUI: Psy Shell v0.7.2 (PHP 5.6.27-1+deb.sury.org~xenial+1 — cli) by Justin Hileman >>> $article = App\Article::create(['title' => 'New Article', 'body' => 'New body']); => App\Article {#679 title: "New Article", body: "New body", updated_at: "2016-11-06 19:55:29", created_at: "2016-11-06 19:55:29", id: 2, } 13.5 KATSOTAAN LOPUKSI KAIKKI ARTIKKELIT: >>> App\Article::all()->toArray(); => [ [ "id" => 1, "title" => "My Updated First Article", "body" => "Lorem Ipsum", "created_at" => "2016-11-06 19:38:18", "updated_at" => "2016-11-06 19:45:30", "published_at" => "2016-11-06 21:38:18", ], [ "id" => 2, "title" => "New Article", "body" => "New body", "created_at" => "2016-11-06 19:55:29", "updated_at" => "2016-11-06 19:55:29", "published_at" => "2016-11-06 21:55:29", ], ] 13.6 OSATAAN ETSIÄ JA VALITA OIKEA KÄSITTELYYN: >>> $article = App\Article::find(2); => App\Article {#686 id: 2, title: "New Article", body: "New body", created_at: "2016-11-06 19:55:29", updated_at: "2016-11-06 19:55:29", published_at: "2016-11-06 21:55:29", } >>> $article->title = 'Brand New Article'; => "Brand New Article" >>> $article->save(); => true 13.7 UPDATE_METODI ILMAN TOIMII ILMAN ERILLISTÄ SAVE-METODIN KUTSUA: >>> $article->update(['body' => 'Updated AGAIN']); => true >>> App\Article::all()->toArray(); => [ [ "id" => 1, "title" => "My Updated First Article", "body" => "Lorem Ipsum", "created_at" => "2016-11-06 19:38:18", "updated_at" => "2016-11-06 19:45:30", "published_at" => "2016-11-06 21:38:18", ], [ "id" => 2, "title" => "Brand New Article", "body" => "Updated AGAIN", "created_at" => "2016-11-06 19:55:29", "updated_at" => "2016-11-06 20:00:37", "published_at" => "2016-11-06 21:55:29", ], ] >>>exit /* |-------------------------------------------------------------------------- | 14. Tietokannan taulun sisältö ELOQUENT-ORMin avulla web-sivulle |-------------------------------------------------------------------------- */ 14.0 Huom: app/Article.php Tyhjä alkuksi 14.1 Lisätään uusi reitti, joka ei kutsu kontrolleria eikä näkymää: routes/web.php ----------------------------------------------> Route::get('foo', function () { return 'Bar'; }); => http://192.168.1.167/foo Tulostaa "Bar" 14.2 Lisätään uusi reitti artikkelien näyttämistä varten: routes/web.php ----------------------------------------------> Route::get('articles', 'ArticlesController@index'); 14.3: Luodaan tyhjä kontrolleri: php5.6 artisan make:controller ArticlesController Controller created successfully. => app/Http/Controllers/ArticlesController.php ----------------------------------------------> app/Http/Controllers/ArticlesController.php ----------------------------------------------> http://192.168.1.167/articles Tulostaa "get all articles" Muokataan 2 ===> app/Http/Controllers/ArticlesController.php ----------------------------------------------> http://192.168.1.167/articles Tulostaa: [{"id":1,"title":"My Updated First Article","body":"Lorem Ipsum","created_at": "2016-11-06 19:38:18","updated_at":"2016-11-06 19:45:30","published_at": "2016-11-06 21:38:18"},{"id":2,"title":"Brand New Article","body": "Updated AGAIN","created_at":"2016-11-06 19:55:29","updated_at": "2016-11-06 20:00:37","published_at":"2016-11-06 21:55:29"}] WAUUUUUUUU! /* |-------------------------------------------------------------------------- | 15. Tietokannan taulun sisältö *näkymän kautta muotoiltuna* | ELOQUENT-ORMin avulla web-sivulle |-------------------------------------------------------------------------- */ 15.1 Muokataan kontrolleria niin, että tietokannasta haettu sisältö annetaan muokattavaksi articles.index-näkymälle: app/Http/Controllers/ArticlesController.php ----------------------------------------------> with('articles', $articles); } } 15.2 Tee kansio: resources/views/articles Ja sinne tiedosto: resources/views/articles/index.blade.php ----------------------------------------------> @extends('app') @section('content')

Articles

@stop ----------------------------------------------> => http://192.168.1.167/articles Tulostaa "noin suurinpiirtein:

Eka Laraveltemplate


Articles


15.3 Listataan artikkelit index.blade.php:llä resources/views/articles/index.blade.php ----------------------------------------------> @extends('app') @section('content')

Articles

@foreach ($articles as $article)

{{ $article->title }}

{{ $article->body }}

@endforeach @stop ----------------------------------------------> ===> Artikkelit tulostuu hienosti !!!! /* |-------------------------------------------------------------------------- | 16. Yhden artikkelin näyttäminen |-------------------------------------------------------------------------- */ 16.1 Alkuvalmistelut: A. Uusi route: Route::get('articles/{id}', 'ArticlesController@show'); B. Controlleriin uusi metodi ton mukaan: public function show($id) { return $id; } C. Testataan: => http://192.168.1.167/articles/foo Tulostaa "foo" => http://192.168.1.167/articles/1 Tulostaa "1" 16.2 Palautetaan yksi artikkeli JSONina: A. Controllerin metodia muokataan: public function show($id) { $article = Article::find($id); return $article; } => http://192.168.1.167/articles/1 Tulostaa: {"id":1,"title":"My Updated First Article","body":"Lorem Ipsum","created_at":"2016-11-06 19:38:18","updated_at":"2016-11-06 19:45:30","published_at":"2016-11-06 21:38:18"} 16.3 Muotoillaan yksi artikkeli ja palautetaan virhe jos ei löydy: A. Controller: public function show($id) { // $article = Article::find($id); $article = Article::findOrFail($id); return view('articles.show')->with('article', $article); } /////////REUNAHUOMAUTUS//////// HUOMAA findOrFail-metodi! Kuinka paljon se näyttää virheitä/ongelmaa, jos artikkelia halutulla id:llä ei löydy. Sen voi säätää filessä: config/app.php NÄYTTÄÄ KAIKKI VIRHEILMOT DEVAUSVAIHEESSA: 'debug' => env('APP_DEBUG', false), POISTAA KAIKKI VIRHEILMOT PRODUCTIONVAIHEESSA, NÄYTTÄÄ YKSINKERTAISEN ERROR-SIVUN: 'debug' => false, /////////REUNAHUOMAUTUS//////// B. Tehdään index.blade.php:hen linkki edelliseen: resources/views/articles/index.blade.php ---------------------------------------------->

{{ $article->title }}

C. Lopuksi tehdään kontrollerissa mainittu näkymä: resources/views/articles/show.blade.php ----------------------------------------------> @extends('app') @section('content')

{{ $article->title }}

{{ $article->body }}

@stop ----------------------------------------------> /* |-------------------------------------------------------------------------- | 17. Artikkelin lisääminen lomakkeelta |-------------------------------------------------------------------------- */ 17.1 Asennetaan aluksi lomakkeiden luontia varten lisäpaketti: tämän ohjeen mukaan https://laravelcollective.com/docs/5.3/html ELI: A: Komenna composer require "laravelcollective/html":"^5.3.0" B. Lisätään seuraavaan tiedostoon 3 riviä (yksi providers-kohtaan ja yksi aliases-kohtaan) config/app.php ----------------------------------------------> 'providers' => [ // ... Collective\Html\HtmlServiceProvider::class, // ... ], ... 'aliases' => [ // ... 'Form' => Collective\Html\FormFacade::class, 'Html' => Collective\Html\HtmlFacade::class, // ... ], ----------------------------------------------> C. Lopuksi komenna vielä LISÄKSI: composer update 17.2. Luodaan lomakkeekke reitti/kontrolleri/näkymä A. uusi "create"-route: (HUOM PITÄÄ LISÄTÄ ENNEN TOTA ARTICLES-ROUTEa) Route::get('articles/create', 'ArticlesController@create'); Route::get('articles/{id}', 'ArticlesController@show'); B. Controlleriin uusi funktio: public function create() { return view('articles.create'); } C. Luodaan uusi template: resources/views/articles/create.blade.php ----------------------------------------------> @extends('app') @section('content')

Write a New Article


{!! Form::open() !!} {!! Form::label('name', 'Name:') !!} {!! Form::text('name', null, ['class' => 'form-control', 'foo' => 'bar']) !!}
{!! Form::label('address', 'Address:') !!} {!! Form::text('address', "JKL", ['class' => 'form-control', 'foo' => 'bar']) !!} {!! Form::close() !!} @stop ----------------------------------------------> 17.3 Selaimeen => http://192.168.1.167/articles/create NÄYTTÄÄ SELAIMESSA TÄLTÄ:----->

Write a New Article



/* |-------------------------------------------------------------------------- | 18. Artikkelin tallentaminen tietokantaan lomakkeelta |-------------------------------------------------------------------------- */ A. Lisätään uusi route (huomaa post-route): Route::post('articles', 'ArticlesController@store'); B. Kontrolleriin tällainen muutos (EI SELVINNYT MIKSI?) //use Illuminate\Http\Request; use Request; C. Ja kontrolleriin tietty itse store-metodi: public function store() { $input = Request::all(); return $input; } D. Muutetaan lomakkeen action viittaamaan tuohon uuteen routeen ja muutetaan toinen input textareaksi ja lisätään button resources/views/articles/create.blade.php ----------------------------------------------> @extends('app') @section('content')

Write a New Article


{!! Form::open(['url' => 'articles']) !!} {!! Form::label('title', 'Title:') !!} {!! Form::text('title', null, ['class' => 'form-control']) !!}
{!! Form::label('body', 'Body:') !!} {!! Form::textarea('body', null, ['class' => 'form-control']) !!}
{!! Form::submit('Add Article', ['class' => 'btn btn-primary form-control']) !!} {!! Form::close() !!} @stop ----------------------------------------------> E. Kun lomakkeen kenttiin kirjoitetaan ja lomakkeen data lähetetään, niin selaimeen tulee tuo $input-muuttujan sisältä JSON-muodossa: {"_token":"UxoNqPA7LOQnqi3cMTwFL1X1d7KjayN2uz5Xt66Z","title":"sada","body":"asdasd"} F. Kokeile vielä muutaa store-metodia seuraavasti: $input = Request::get('title'); HUOMAAT------> Saat takaisin title-kenttään kirjoittamasi tekstin: eli "sada" /* |-------------------------------------------------------------------------- | 19. Artikkelin lopullinen tallentaminen tietokantaan lomakkeelta |-------------------------------------------------------------------------- */ A. Kontrolleri // NÄIN MUUTETAAN LAJITTELUJÄRJESTYS LISÄYKSEN JÄLKEEN public function index() { //$articles = Article::all(); $articles = Article::latest('published_at')->get(); return view('articles.index')->with('articles', $articles); } // JA ITSE TALLENTAMINEN: public function store() { $input = Request::all(); // Jos ei olisi tietokannan kentän/migrationissa //määriteltynä defaulttina current timestamppia //$input['published_at'] = Carbon::now(); //PIHVIPIHVI: Article::create($input); return redirect('articles'); // Näinkin kenttä kerrallaan: //$article = new Article; //$article->title = $input['title']; } // LISÄTÄÄN VIELÄ DATE_KENTTÄ LOMAKKEESEEN: resources/views/articles/create.blade.php ----------------------------------------------> @extends('app') @section('content')

Write a New Article


{!! Form::open(['url' => 'articles']) !!} {!! Form::label('title', 'Title:') !!} {!! Form::text('title', null, ['class' => 'form-control']) !!}
{!! Form::label('body', 'Body:') !!} {!! Form::textarea('body', null, ['class' => 'form-control']) !!}
{!! Form::label('published_at', 'Publish On:') !!} {!! Form::input('date', 'published_at', date('Y-m-d'), ['class' => 'form-control']) !!}
{!! Form::submit('Add Article', ['class' => 'btn btn-primary form-control']) !!} {!! Form::close() !!} @stop ----------------------------------------------> /* |-------------------------------------------------------------------------- | 20. FORM VALIDATION |-------------------------------------------------------------------------- */ 20.1 Luodaan CreateArticleRequest php5.6 artisan make:request CreateArticleRequest Request created successfully. 20.2 MUUTETAAN app\Http\Requests\CreateArticleReques.php ... public function authorize() { //MUUTETTU: return true; } ... public function rules() { return [ //LISÄTTY: 'title' => 'required|min:3', 'body' => 'required', 'published_at' => 'required|date' ]; } } 20.3 Articles-kontrollerin store-metodi käyttää sitten tuota, kun tehdään seuraavia muutoksia: public function store(\App\Http\Requests\CreateArticleRequest $request) { //$input = Request::all(); // Jos ei olisi tietokannan kentän/migrationissa määriteltynä defaulttina current timestamppia //$input['published_at'] = Carbon::now(); Article::create($request->all()); return redirect('articles'); // Näinkin kenttä kerrallaan: //$article = new Article; //$article->title = $input['title']; } 20.4 Virheilmoitus näkyviin lomakkeessa: resources/views/articles/create.blade.php ----------------------------------------------> ... {!! Form::close() !!} @if ($errors->any()) @endif @stop /* |-------------------------------------------------------------------------- | 21. Validointi suoraan kontrollerissa |-------------------------------------------------------------------------- */ Tällaisilla muutoksilla voi kokeilla (jotain häikkää kirjastoviittauksissa kuten huomaatte :) ... use Illuminate\Http\Request; //use Request; ... public function store(Request $request) { $this->validate($request, ['title' => 'required|min:3', 'body' => 'required']); ...