Laravel 5.14 by Dummy
1 Sisällysluettelo 1 Laravel 5.1.4 by Dummy - johdantoa... 4 1.1 Asennettava ympäristöön... 4 1.2 Aloita... 4 1.3 Luo projekti... 6 1.4 Kansiorakenteet www-juuressa ja laravel-kansiossa asennuksen jälkeen... 7 2 Laravelin käsitteitä... 9 2.1 Controller (Ohjain)... 9 2.2 Model (malli)... 11 2.3 Route (reitti)... 12 2.4 Lisää reiteistä... 13 2.5 View (näkymä) ja template (ulkoasu sivustolle)... 14 2.5.1 Template... 14 2.5.2 layouts/master.blade.php... 14 2.5.3 Blade- käytettävät komennot... 15 3 Mallijärjestelmän luominen... 17 3.1 Sivuston rakenne... 17 3.2 Tietokannan rakenne... 17 3.3 Ulkoasu kuntoon... 18 4 Luo tietokanta... 22 4.1 Eloquent... 22 4.1.1 Nimikäytäntöjä... 22 4.2 Migration (tiedon siirtäminen, tietokanta)... 22 4.3 Tietokanta ja luokat kaaviona... 23 4.3.1 Yhteys kantaan... 24 4.3.2 Artisan... 24 4.3.3 Migration... 24 4.4 Olemassaolevat luokat... 24 4.5 Muiden kuin olemassa olevien luokkien ja niihin liittyvien taulujen luominen... 26 4.5.1 Mallin luominen (Eloquent ORM)... 27 4.6 Pohjatietojen syöttäminen (seeding)... 27 5 Autentikointi... 30 5.1 Reittien suojaaminen... 31 5.1.1 Reitit... 31
2 5.2 Näkymät (Views)... 32 5.2.1 Lomakkeiden luominen... 32 5.3 Tietojen lukeminen taulusta... 36 5.3.1 Kaikki tietueet taulusta users (kokeillaan ensiksi logiikka)... 36 5.3.2 Admin-näkymä ja logout... 37 6 Muut sivut... 39 6.1 Yhden käyttäjän datarit... 39 6.1.1 Reitit... 39 6.1.2 Kontrolleri... 40 6.1.3 Näkymät... 41 7 Laravel-sovellus web-hotellin alidomainiin... 44 7.1 Laravel-kansio domainiin www-juurta ylemmäksi... 44 7.2 Laravelin public-kansio alidomainin juureen... 44 7.3 paths.php ja index.php -muunnokset... 44 7.3.1 paths.php seuraavat korvaukset:... 44 7.3.2 index.php seuraavat korvaukset:... 44 7.3.3 Päivitä lisäksi tietokannan konfiguraatio.... 44
3 osa 1 - asennus
4 1 Laravel 5.1.4 by Dummy - johdantoa Luomme tässä oppaassa pikkuriikkisen mallisovelluksen. Huomaat sitä katsoessasi, että sovelluksessa olisi paljon kehittämisen varaa opas on oikeastaan vain malli periaatteista. Laravelia käyttäessäsi ole tarkkana versiosta: eri versioissa on erilaisia toimintoja, polut vaihtelevat eivätkä vanhat ohjeet päde uuteen versioon. 1.1 Asennettava ympäristöön - xampp - Composer - Laravel ohje laravel.com, versiona 5.14 1.2 Aloita 1. xampp päälle, käynnistä hallintapaneelista Apache ja MySQL 2. Hae ja asenna composer https://getcomposer.org/composer-setup.exe (voi kirjoittaa käynnistyriville) a. asenna ilman shell-asennusta b. php.exe on polun c:\\xampp\php\php.exe päässä c. jos olet avannut komentokehotteen, sulje se asennuksen jälkeen seuraavassa kuvassa on myös ohjeita, jos composerin komennot eivät tunnu toimivan
5 3. Avaa komentokehote ja hae Laravel seuraavalla komennolla: composer global require laravel/installer=~1.1 4. Sulje komentokehote 5. Vaihda polut (tämä vaikuttaa oppilaitoksen ympäristössä profiilin asetuksiin. Kotona asennuksen pitäisi luoda polut automaattisesti). setx PATH %PATH%;%APPDATA%\Composer\vendor\bin 6. Sulje komentokehote HUOM! setx PATH tekee polusta pysyvän (komentokehote tulee kuitenkin sulkea ennen seuraavien komentojen ajamista). Polkujen olemassaolon voi tarkistaa komentokehotteessa echo %PATH% Ja jos menee pieleen (eli polku esim. kasvaa liian pitkäksi), korjaus sujuu seuraavasti: Avaa uusi CMD Aja: setx path "" sulje CMD Avaa uusi CMD Aja: setx path "C:\xampp\php;%LOCALAPPDATA%\ComposerSetup\bin;%APPDATA%\Composer\vendor\bin"
1.3 Luo projekti Avaa komentokehote, vaihda kansioksi c:\\xampp\htdocs ja kirjoita: laravel new datarit 6 Luomasi sivuston toiminnat voit tarkistaa www-selaimella, se aukeaa osoitteessa http://localhost/datarit/public Huom! Tavallisesti http-portti on 80 ja https-portti on 443. Jos koneessasi on esim. Skype, voit joutua muuttamaan portteja (muuta portti 80 esim. 8080:ksi ja 443 esim. 4433:ksi). Näitä voit muuttaa Xampin ohjauspaneelissa klikkamalla painiketta Config. Tiedostosta httpd.conf muutetaan seuraavat: ServerName localhost:80 -> ServerName localhost:8080 Listen 80 -> Listen 8080 Tiedostosta httpp-ssl.conf taas: Listen 433 -> Listen 4433 <VirtualHost _default_:4433> -> <VirtualHost _default_:4433> Tällöin osoite on muodossa http://localhost:8080/datarit/public. Virheet löydät logeista: /storage/logs/laravel.log
1.4 Kansiorakenteet www-juuressa ja laravel-kansiossa asennuksen jälkeen 7
8 osa 2 - käsitteitä
9 2 Laravelin käsitteitä 2.1 Controller (Ohjain) Käsittelijä (Controller) / Ohjain eli kontrolleri vastaanottaa käyttäjältä tulevat käskyt sekä muuttaa mallia ja näkymää vastauksena niihin. - ohjaimet ovat kansiossa app/http/controllers Kun luot uuden ohjaimen, se perii luokan BaseController. Luokassa voi olla periaatteessa 7 eri toimintoa. Alla näkyvät polut toimintoihin (Lähde: http://maxoffsky.com/code-blog/laravel-first-framework-chapter-5- understanding-controllers/)
10 - kansiossa app/http/controllers/auth on valmiita ohjaimia sisäänrakennettua autentikointia (throttling) varten (PasswordController.php, AuthController.php) - nämä ohjaimet eivät näytä kaikkia metodeja, osa metodeista on piilotettu trait:iin (malliluokka, jonka metodit ovat yleisesti käytettävissä).
2.2 Model (malli) Malli (Model) toimii sovelluksen ja tietokannan välissä ja kuljettaa dataa näkymään kontrollerin eli ohjaimen kautta. Siinä on tiedon tallentamista, ylläpitoa ja käsittelyä. 11 - mallit sijoitetaan kansioon app, niiden nimet alkavat isolla kirjaimella - kansiossa on valmiina osa mallista User, jota käytetään sisäänrakennetussa autentikoinnissa - kuvasta voi päätellä sekä taulun nimen (users) että pakolliset kentät (name,email,password,remember_token)
2.3 Route (reitti) Reitti ohjaa pyynnön oikealle kontrollerille tai näkymään - jokainen sivun näyttäminen tai lomakkeen lähetys vaatii ohjauksen - reitti voidaan ohjata esimerkiksi funktiolle, joka käy läpi käyttäjän syötettä - reittiin voi myös laittaa mukaan ehtoja, joiden täytyy toteutua ennen datan vientiä haluttuun kohteeseen - ohjaukset sijoitetaan tiedostoon app/http/routes.php 12 Testaa: Lisää routes.php-tiedostoon seuraava rivi ja avaa sovellus osoitteessa http://localhost:8080/datarit/public/users Route::get('users', function() return 'Users!'; ); - sen voi sijoittaa myös controller-luokkiin Route::get('users', 'UserController@getIndex'); - pyyntö /users kutsuu UserController-luokan getindex metodia Reiteissä voi myös olla ryhmiä ja nimialueita. Reitissä annetaan ryhmälle yleisnimi ja määrityksissä tarkennetaan sen nimen sisällä olevat reiti. Route::group(['middleware' => 'auth'], function () Route::get('/', function () // Uses Auth Middleware ); Route::get('user/profile', function () // Uses Auth Middleware ); ); Ja luethan lisää: http://laravel.com/docs/master/routing#required-parameters
2.4 Lisää reiteistä http://maxoffsky.com/code-blog/laravel-first-framework-chapter-5-understanding-controllers/ Kuvan reitissä näkymä, pyyntö on get 13 Kuvan reitissä ohjaimen(kontrollerin) metodi, pyyntö on get
2.5 View (näkymä) ja template (ulkoasu sivustolle) Näkymä (View) määrittää käyttöliittymän ulkoasun ja tietojen näytön esityksen käyttöliittymässä. Näkymään kirjoitetaan siis html. - sijoitetaan resources/views- kansioon - sisältävät sovelluksen HTML-osuuden - tiedostojen nimi: nimi.blade.php 2.5.1 Template - blade on Laravelin template- eli mallijärjestelmä, mahdollistaa perinnän ja yksinkertaisia kontrollirakenteita, esim. if ja for - template-sivu rakennetaan kirjoittamalla siihen sivulla toistuva html-merkkaus - tiedostoon sijoitetaan sisältö kirjoittamalla @yield( content ) - tallennetaan polkuun resources/views/layouts/master.blade.php - malli peritään muihin sivuihin ja niihin määritellään sisältö, joka sijoitetaan @yield( content )- kohtaan - CSS, JavaScript ja kuvat lisätään kansioon./public/ - vaihtuvat tyylisivut merkitään head-osuuteen merkkausta - HTML::style('tyyli.css') 14 2.5.2 layouts/master.blade.php Jatka testausta: <html> <body> <h1>laravel Quickstart</h1> @yield('content') </body> </html> users.blade.php perii edellisestä tiedostosta osan, korvaa osan Korjaa: @extends('layouts/master') @section('content') Users! @stop Muutetaan tämän jälkeen /users-reittiä palautetaan sanan sijaan näkymä (view) Route::get('users', function() return view('users'); );
15 2.5.3 Blade- käytettävät komennot Katso myös http://laravel.com/docs/5.1/blade $var muuttujan arvon näyttäminen $var or 'default' - muuttujan arvon näyttäminen oletusarvolla, jos muuttujaa ei ole olemassa - $var - Echo escaped content - -- Comment -- - kommentti - @extends('layout') perii mallin 2.5.3.1 Ehdot - @if(condition) aloittaa ehtolohkon - @else aloittaa else-lohkon - @elseif(condition) - aloittaa elseif-lohkon - @endif lopettaa ehtolohkon 2.5.3.2 Silmukat - @foreach($list as $key => $val) - @endforeach - @for($i = 0; $i < 10; $i++) - @endfor - @while(condition) - @endwhile 2.5.3.3 Sisällyttäminen - @include(file) toisen blade-tiedoston sisällyttäminen - @include(file, ['var' => $val,...]) sisällyttäminen, sisällytettävään viedään muuta tietoa muuttujassa mukaan 2.5.3.4 Muuta - @each('file',$list,'item') - Renders a template on a collection - @each('file',$list,'item','empty') käsitellään mallin elementtiryhmän jokaista elementtiä - @yield('section') aloittaa sisältöosan - @show näyttää ja lopettaa osan - @section('name') aloittaa osan - @stop lopettaa osan
16 osa 3 - ulkoasu
17 3 Mallijärjestelmän luominen Mallina toimii pikkuriikkinen ja hiukan keskeneräinen sovellus, jolla voi kirjata pisteitä eli datareita käyttäjille. 3.1 Sivuston rakenne 3.2 Tietokannan rakenne
18 3.3 Ulkoasu kuntoon Laadi ensin tavallinen html-sivu css-tiedostoineen (voit käyttää - ja kannattaa käyttää - esim. Bootstrappohjaa avuksi). Ulkoasusta erotellaan seuraavaksi kaikki toistuvat osat. Muiden paikalle merkataan paikka, jonka varsinainen tiedosto täyttää. Tämä tiedosto tallennetaan kansioon resources/views/layout nimellä master.blade.php. Luo public-kansioon css-tiedostoja varten alikansio css ja kuvia varten alikansio img. Alla olevassa esimerkkitiedostossa merkinnät on korostettu keltaisella (sitä voi käyttää mallijärjestelmän mallina, tarvittava css-tiedosto löytyy Leenan sivuilta toimeksiannon kohdalta, tallenna nimellä tyyli.css): resources\views\layouts\master.blade.php <!doctype html> <html lang="fi"> <head> <meta charset="utf-8" /> <meta name="author" content="leena Järvenkylä-Niemi"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> @yield('title') @yield('tyyli') <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> <script> $(function() var pull = $('#pull'); menu = $('nav ul'); menuheight = menu.height();
19 $(pull).on('click', function(e) e.preventdefault(); menu.slidetoggle(); ); </head> <body> <header> $(window).resize(function() var w = $(window).width(); if(w > 320 && menu.is(':hidden')) menu.removeattr('style'); ); ); </script> <h1 class="paaotsikko">datarit</h1> </header> <div class="nav"> @yield('navi') <div id="asia"> <div id="asiasisalto"> @yield('content') <!--asia--> <footer> <div id="alapalkinsisalto"> @ljn <!--alapalkin_sisalto--> </footer><!-- alapalkki--> </body> </html> Varsinainen dokumentti perii master.blade.php:ssä esitetyt osat ja siihen lisätään sivu-kohtainen htmlmerkkaus masterissa annettuihin alueisiin seuraavasti: esimerkki welcome.blade.php @extends('layouts/master') @section('title') <title>datarit - tervetuloa</title> @stop @section('tyyli') <link rel="stylesheet" type="text/css" href="css/tyyli.css"> <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> @stop @section('navi') <div id="logout"> <a href="auth/login" class="nav">kirjaudu</a> <a href="auth/register" class="nav">rekisteröidy</a> @stop @section('content') <h1>tervetuloa!</h1> <p>tämän sovelluksen avulla seuraamme datareiden kertymistä.</p> <p>itse sivusto on tehty malliksi Laravelin käytöstä, siinä on huomattavia puutteita suunnittelussa, toiminnoissa ja ulkoasussa.</p>
20 @stop Lisätään reitit sivulle. Reitit <?php /* -------------------------------------------------------------------------- Application Routes -------------------------------------------------------------------------- Here is where you can register all of the routes for an application. It's a breeze. Simply tell Laravel the URIs it should respond to and give it the controller to call when that URI is requested. */ Route::get('/', function () return view('welcome'); ); Route::get('/welcome', function () return view('welcome'); );
21 osa 4 - tietokanta
22 4 Luo tietokanta 4.1 Eloquent Laraveliin sisäänrakennettu Eloquent ORM helpottaa tietokantaliittymää. Sitä voidaan käyttää suorien komentojen lisäksi. perusfunktiot one-to-one viittaukset one-to-many viittaukset many-to-many viittaukset Eloquent ORM :ssä jokainen malli vastaa jotain taulua tietokannassa. Datari malli vastaa siis datarit taulua. Jos seurataan oikeaa nimikäytäntöä, voimme helposti tehdä kyselyt. 4.1.1 Nimikäytäntöjä Malli alkaa isolla kirjaimella ja on yksikössä, esim. Datari Tietokannan taulu alkaa pienellä kirjaimella ja on monikossa, esim. dataris Alla on esimerkki Eloquent ORM komennoista: Hae kaikki datarit Hae tietue Tuhoa tietue Datari::all() Datari::find(id) Datari::delete(id) Lähde: https://scotch.io/tutorials/a-guide-to-using-eloquent-orm-in-laravel 4.2 Migration (tiedon siirtäminen, tietokanta) Luo aluksi tietokanta (skeema) phpmyadminin avulla: tässä nimenä on datarikanta. Ohjelma avautuu Xampin ohjauspaneelista MySQL-riviltä painikkeesta Admin tai, jos olet muuttanut portteja, osoitteesta http://localhost:8080/phpmyadmin Avaa phpmyadmin-näkymässä välilehti Tietokannat ja täytä lomake Luo tietokanta anna kannalle nimi ja määritä merkistöksi utf8_unicode_ci. Skeemalla on automaattisesti käyttäjä root, jolla ei ole salasanaa.
23 4.3 Tietokanta ja luokat kaaviona Kuvassa näkyvät tietokannan luomiseen ja käsittelyyn tarvittavat luokat. Sinisellä pohjalla olevat luokat ovat automaattisesti olemassa, muut tulee kehittäjän luoda. CreateUsersTable ja CreateDatarisTable ajetaan luontihetkellä, User ja Datari taas ovat käytössä kyselyvaiheessa. Seeder on olemassaolevan luokka, jonka yksittäisen taulun tietojensyöttäjä (UserTableSeeder) perii.
24 4.3.1 Yhteys kantaan tiedostossa config/database.php määritetään eri tietokantaympäristöjen asetukset. Korjaa kohtaa mysql seuraavasti: 'mysql' => [ 'driver' => 'mysql', 'host' => 'localhost', 'database' => 'datarikanta', 'username' => 'root', 'password' => '', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, ], 4.3.2 Artisan Artisan on Laravelin komentorivi-käyttöliittymä. Se toimii komentokehotteessa vain, jos olet projektisi kansiossa. 4.3.3 Migration Tietokannan hallintaan käytetään Laravelin Migration-toimintoa, joka mahdollistaa skeeman helpon muokkaamisen. 4.4 Olemassaolevat luokat Laravelia käytettäessä kannattaa sijoittaa käyttäjien hallinta users-tauluun, sille on, kuten aikaisemmin jo kävi ilmi luotu valmis luokka ja erilaisia metodeja, jotka helpottavat autentikointia. Editoi valmista luokkaa seuraavasti: Siinä on kaksi metodia up ja down. Up luo taulun, muunna se tarkoituksiisi sopivaksi, down poistaa taulun.
25 Huom: Käyttäjätaulussa on oltava kenttä remember_token(varchar 100), se tallentaa istuntoja. Salasanan on myös oltava vähintään 60 merkkiä pitkä. Muissa tauluissa on oletusarvoisesti luokat updated_at(date) ja created_at(date). <?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateUsersTable extends Migration /** * Run the migrations. * * @return void */ public function up() Schema::create('users', function (Blueprint $table) $table->increments('id'); $table->string('name'); $table->string('email')->unique(); $table->string('password', 60); $table->remembertoken(); $table->timestamps(); ); /** * Reverse the migrations. * * @return void */ public function down() Schema::drop('users'); Jos ja kun muutat luokkia, sinun tulee ladata ne käyttöön vanhojen tilalle eli ajaa komento composer dumpautoload Komento php artisan migrate luo varsinaisen taulun (käyttäen hyväksi edelläolevaa luokkaa). Voit käydä phpmyadmin avulla katsomassa lopputulosta.
4.5 Muiden kuin olemassa olevien luokkien ja niihin liittyvien taulujen luominen Anna seuraava komento (huom. taulun nimi). Komento luo tiedoston database/migrations-kansioon. Komentokehote on tällöin sovelluksen hakemistossa (c:\\xampp\htdocs\datarit) php artisan make:migration create_dataris_table Editoi komennon luomaa luokkaa seuraavasti: 26 <?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateDatarisTable extends Migration /** * Run the migrations. * * @return void */ public function up() Schema::create('dataris', function($table) $table->increments('datari_id'); $table->date('created_at'); $table->integer('count'); $table->string('source',20); $table->string('course',20); $table->integer('user_id')->unsigned(); $table->date('updated_at'); $table->foreign('user_id')->references('id')->on('users'); ); /** * Reverse the migrations. * * @return void */ public function down() // Huom! Vierasavainten tulee aina olla unsigned. Kentät ovat created_at ja updated_at ovat Eloquentmallin mukaan pakolliset.
27 Aja sen jälkeen kuvan mukaiset komennot composer dump-autoload php artisan migrate Tuloksen voi tarkistaa phpmyadminin avulla. 4.5.1 Mallin luominen (Eloquent ORM) Luo taululle myös malli komennolla php artisan make:model Datari 4.6 Pohjatietojen syöttäminen (seeding) Aloita komennolla php artisan make:seeder UserTable Seeder Komento luo database/seeds kansioon luokan UserTableSeeder, jonka tärkeä metodi on run. Database/seeds kansiossa on valmiina olemassa jo DatabaseSeeder, jota voi käyttää hyväkseen tietojen syötössä (sillä voi kutsua muita seeder-luokkia). Muunna tiedostoa seuraavasti: <?php use Illuminate\Database\Seeder; class UserTableSeeder extends Seeder /** * Run the database seeds. * * @return void */ public function run() DB::table('users')->insert([ 'name' => str_random(10), 'email' => str_random(10).'@gmail.com', 'password' => bcrypt('secret'), ]);
28 Voit kutsua ylläolevaa ja muitakin seeder-luokkia DatabaseSeeder luokasta, käytä call-metodia: <?php use Illuminate\Database\Seeder; use Illuminate\Database\Eloquent\Model; class DatabaseSeeder extends Seeder /** * Run the database seeds. * * @return void */ public function run() Model::unguard(); $this->call(usertableseeder::class); Model::reguard(); Aja luokka ja tarkista lopputulos phpmyadminin avulla. Komento on php artisan db:seed
29 osa 5 - autentikointi
30 5 Autentikointi Hyödyllinen selittävä lähde on: https://mattstauffer.co/blog/login-throttling-in-laravel-5.1
31 5.1 Reittien suojaaminen Laravel 5.14 tukee käyttäjää voimakkaasti autentikoinnissa. Käytössä on auth middleware, joka määritellään app\http\middleware\authenticate.php-tiedostossa. Middlewaren lisääminen reitteihin riittää suojaamiseen. 5.1.1 Reitit Lisää routes.php-tiedostoon seuraavat reitit (osa on admin-sivun varmistusta, osa kirjautumista varten, osa rekisteröintiä, osa uloskirjautumista varten): // Authentication routes... Route::get('/admin', ['middleware' => 'auth','uses'=>'usercontroller@userlist', function() return view('admin'); ]); Route::group(['prefix' => 'auth', 'namespace' => 'Auth'], function() Route::group(['middleware' => 'guest'], function() // Login Route::get('login', ['as' => 'auth.login', 'uses' => 'AuthController@getLogin']); Route::post('login', ['as' => 'auth.login.store', 'before' => 'throttle:2,60', 'uses' => 'AuthController@postLogin']); // Register Route::get('register', ['as' => 'auth.register', 'uses' => 'AuthController@getRegister']); Route::post('register', ['as' => 'auth.register.store', 'uses' => 'AuthController@postRegister']); ); ); Route::group(['middleware' => 'auth'], function() // Logout Route::get('logout', ['as' => 'auth.logout', 'uses' => 'AuthController@getLogout']); ); Route::controllers([ 'password' => 'Auth\PasswordController', ]); Kun jäät jumiin: olet varma, että olet tehnyt kaikki oikein, eikä silti toimi 1. vaihda selainta, käytä Chrome incognito-ikkunaa 2. muuta routes.php-tiedostossa reittien järjestystä, tallenna reitit ja anna komentokehotteessa välimuistin tyhjentävät komennot php artisan clear-compiled php artisan cache:clear php artisan route:clear ja lopuksi composer dumpautoload
32 5.2 Näkymät (Views) kirjautumisnäkymä kansioon resources/views/auth/login.blade.php ja rekisteröitymisnäkymä kansioon resources/views/auth/register.blade.php 5.2.1 Lomakkeiden luominen 5.2.1.1 Esimerkki kirjautumislomakkeesta Tallenna tiedosto, polku on./resources/views/auth/login.blade.php - kuvassa on korostettuna virheenkäsittely. @extends('layouts/master') @section('title') <title>datarit - kirjaudu</title> @stop @section('tyyli') <link rel="stylesheet" type="text/css" href="../css/tyyli.css"> <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> @stop @section('navi') <div id="kotiin"> <a href="../welcome" class="nav">etusivulle</a> <div id="logout"> <a href="register" class="nav">rekisteröidy</a> @stop @section('content') <h1>kirjaudu</h1> <form method="post" action="login" role="form" class="kapea"> <input type="hidden" name="_token" value=" csrf_token() "> @if (count($errors) > 0) <div class="alert alert-danger"> <strong>whoops! </strong> There were some problems with your input. <br> <br> <ul> @foreach ($errors->all() as $error) <li> $error </li> @endforeach </ul> @endif <div class="form-group"> <label for="email">email</label> <input type="email" class="form-control" name="email" id="email" value=" old('email') "> <div class="form-group"> <label for="password">salasana</label> <input type="password" class="form-control" id="password" name="password"> <div> <button type="submit" class="btn btn-default">login</button> </form> @stop </form>
33 5.2.1.2 Esimerkki rekisteröitymislomakkeesta Tallenna tiedosto, polku on./resources/views/auth/register.blade.php - kuvassa on korostettuna virheenkäsittely. @extends('layouts/master') @section('title') <title>datarit - rekisteröidy</title> @stop @section('tyyli') <link rel="stylesheet" type="text/css" href="../css/tyyli.css"> <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> @stop @section('navi') <div id="kotiin"> <a href="../welcome" class="nav">etusivulle</a> <div id="logout"> @stop @section('content') <h1>rekisteröidy käyttäjäksi</h1> <form method="post" action="register"> <input type="hidden" name="_token" value=" csrf_token() "> @if (count($errors) > 0) <div class="alert alert-danger"> <strong>whoops!</strong> There were some problems with your input.<br><br> <ul> @foreach ($errors->all() as $error) <li> $error </li> @endforeach </ul> @endif <div class="form-group"> <label for="name"> Nimi</name> <input class="form-control" id="name" type="text" name="name" value=" old('name') "> <div class="form-group"> <label for="email">email</label> <input type="email" class="form-control" name="email" id="email" value=" old('email') "> <div class="form-group"> <label for="password">salasana</label> <input type="password" class="form-control" id="password" name="password"> <div class="form-group"> <label for="password_confirmation">vahvista salasana</label> <input type="password" class="form-control" name="password_confirmation"> <div> <button type="submit" class="btn btn-default">rekisteröidy</button> </form> @stop
34 5.2.1.3 Virheenkäsittely Korjaa virheenkäsittelijää korostettujen osien kohdalta (app/exceptions/handler.php) se ohjaa takaisin virheen sattuessa. Jos käyttäjä yrittää liian monta kertaa sisälle, sulkee mahdollisuuden tunniksi (näitä arvoja voi säädellä middlewareen rakennettujen trait-luokkien avulla). Jos asia kiinnostaa, tutki: http://laravel.com/docs/master/middleware <?php namespace App\Exceptions; use Exception, Redirect; use Symfony\Component\HttpKernel\Exception\HttpException; use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; class Handler extends ExceptionHandler /** * A list of the exception types that should not be reported. * * @var array */ protected $dontreport = [ HttpException::class, ]; /** * Report or log an exception. * * This is a great spot to send exceptions to Sentry, Bugsnag, etc. * * @param \Exception $e * @return void */ public function report(exception $e) return parent::report($e); /** * Render an exception into an HTTP response. * * @param \Illuminate\Http\Request $request * @param \Exception $e * @return \Illuminate\Http\Response */ public function render($request, Exception $e) if ($e instanceof TooManyRequestsHttpException) return Redirect::back() ->withinput($request->only('email', 'remember')) ->witherrors([ 'email' => 'Too many failed login attempts!', ]); return parent::render($request, $e);
35 Luokka AuthController (.\app\http\controllers\auth\authcontroller.php) muuttuu myös hiukan, siihen lisätään ohjaus admin-näkymään: näin tehtynä käyttäjä ohjautuu automaattisesti sekä rekisteröinnin että kirjautumisen jälkeen näkymään, poistuminen sieltä tulee tehdä logout-toiminnon avulla. <?php namespace App\Http\Controllers\Auth; use App\User; use Validator; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\ThrottlesLogins; use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers; class AuthController extends Controller /* -------------------------------------------------------------------------- Registration & Login Controller -------------------------------------------------------------------------- This controller handles the registration of new users, as well as the authentication of existing users. By default, this controller uses a simple trait to add these behaviors. Why don't you explore it? */ use AuthenticatesAndRegistersUsers, ThrottlesLogins; private $redirectto = '/admin'; /** * Create a new authentication controller instance. * * @return void */ public function construct() $this->middleware('guest', ['except' => 'getlogout']); /** * Get a validator for an incoming registration request. * * @param array $data * @return \Illuminate\Contracts\Validation\Validator */ protected function validator(array $data) return Validator::make($data, [ 'name' => 'required max:255', 'email' => 'required email max:255 unique:users', 'password' => 'required confirmed min:6', ]); /** * Create a new user instance after a valid registration. * * @param array $data * @return User */ protected function create(array $data) return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => bcrypt($data['password']), ]);
36 Huom: luokka AuthController käyttää middlewareen kätkettyjä metodeja viittaus niihin on use AuthenticatesAndRegistersUsers, ThrottlesLogins; Jos haluat katsoa esim. getlogin ja getregister-metodeja, määrittely ei näy tässä, vaikka reitissä pyyntö ohjataan AuthController-ohjaimelle. Voit katsoa sovellusta selaimella osoitteilla: http://localhost/projektinnimi/public/auth/register http://localhost/projektinnimi/public/auth/login 5.3 Tietojen lukeminen taulusta 5.3.1 Kaikki tietueet taulusta users (kokeillaan ensiksi logiikka) Käyttäjätauluun liittyvä ohjain on oletusarvoisesti kansiossa app/http/controllers nimellä UserController.php. Ohjaimessa tulee olla metodi index(), joka palauttaa kaikki tietueet, tässä näkymälle users. Toinen metodi, joka luodaan on userlist(), se palauttaa tiedot näkymälle admin. Jos tiedostoa UserController ei ole, luo se. <?php namespace App\Http\Controllers; use DB; use App\Http\Controllers\Controller; class UserController extends Controller /** * Show a list of all of the application's users. * * @return Response */ public function index() $users = DB::table('users')->get(); return view('users', ['users' => $users]); public function userlist() $users = DB::table('users')->get(); return view('admin', ['users' => $users]);
37 Lisää reitti routes.php-tiedostoon: Route::get('users', array('uses'=>'usercontroller@index')); Sivustossa kutsu on : localhost:8080/datarit/public/users Seuraavaksi rakennamme samalla periaatteella admin-sivun, jossa on edellisen lisäksi autentikointi ja linkit datarien lisäyssivulle ja henkilökohtaiseen datarinäkymään. 5.3.2 Admin-näkymä ja logout Luo admin.blade.php-tiedosto hyödyntäen welcome.blade.php-tiedostoa. Korjataan kuitenkin yläosan linkkejä: <a href="url::route('auth.logout') ">Kirjaudu ulos</a> @section('navi') <div id="logout"> <a href="auth/logout" class="nav">kirjaudu ulos</a><br> @stop Tämä vastaa osoitetta http://localhost/projektinnimi/public/auth/logout Sivulle lisätään nimet ja linkit tietoihin: @foreach($users as $user) <p>$user->name<br> <a href="storedatari/$user->id">lisää datareita</a><br> <a href="getuserdataris/$user->id">näytä datarit</a></p> @endforeach
38 osa 6 muita sivuja
39 6 Muut sivut Muista sivuista toteutetaan kaksi: sivu, joka näyttää yhden käyttäjän datarit ja sivu, jolla voi lisätä datareita. 6.1 Yhden käyttäjän datarit Reitteihin lisätään parametrit, joilla eritellään käyttäjät. Sekä getuserdataris että storedatari -reittien tulee olla autentikoidulla alueella, joten mukaan on laitettava myös viittaus autentikointiin eli ['middleware' => 'auth', Molempien storedatari-näkymien reitti on kontrollerin metodiin sisäänrakennettu - post uudelleenohjaa sivustoa ja get hakee käyttäjän ja kutsuu storedatari-näkymää. 6.1.1 Reitit Route::get('storedatari/id', ['middleware' => 'auth', 'uses'=>'dataricontroller@getstoredatari']); Route::post('storedatari/id', ['middleware' => 'auth', 'uses'=>'dataricontroller@poststoredatari']); Route::get('getuserdataris/id', ['middleware' => 'auth', 'uses'=>'dataricontroller@getuserdataris', function() return view('getuserdataris'); ]);
40 6.1.2 Kontrolleri Taululle dataris tehdään ohjainluokka, joka on rakenteeltaan samanlainen kuin UserController. Huomaa metodin poststoredatari lähettämä uudelleenohjaus. Alussa keltaisella korostetut kirjastoluokat täytyy käyttäjän lisätä. <?php namespace App\Http\Controllers; use DB; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Http\Response; use Illuminate\Http\RedirectResponse; use App\Datari; class DatariController extends Controller /** * Show a list of all of the application's users. * * @return Response */ public function index() $dataris = DB::table('dataris')->get(); return view('dataris', ['dataris' => $dataris]); public function getuserdataris($userid) $merkinnat = DB::table('dataris') ->where('user_id',$userid) ->orderby('updated_at') ->get(); return view('getuserdataris',['merkinnat' =>$merkinnat]); public function poststoredatari(request $data) $merkinta=new Datari; $merkinta->count=$data->amount; $merkinta->source=$data->source; $merkinta->course=$data->course; $merkinta->user_id=$data->user_id; $merkinta->save(); return redirect()->action('dataricontroller@getuserdataris',[$data->user_id]); public function getstoredatari($id) $user = DB::table('users')->where('id',$id)->first(); return view('/storedatari',['user' =>$user]);
41 6.1.3 Näkymät Tämä näkymä näyttää yhden käyttäjän datarit. Sille tullaan admin-sivulta. 6.1.3.1 getuserdataris.blade @extends('layouts/master') @section('title') <title>datarit - näytä käyttäjän datarit</title> @stop @section('tyyli') <link rel="stylesheet" type="text/css" href="../css/tyyli.css"> <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> @stop @section('navi') <div id="logout"> <a href="../admin" class="nav">hallintasivulle</a> <a href="auth/logout" class="nav">kirjaudu ulos</a> @stop @section('content') <h1>datarit</h1> <div class="container"> <div class="content"> <p> @foreach($merkinnat as $merkinta) <p>$merkinta->updated_at</p> <p>$merkinta->source</p> <p>$merkinta->course</p> <p>$merkinta->count</p> @endforeach </body> </html> @stop 6.1.3.2 storedatari.blade @extends('layouts/master') @section('title') <title>datarit - lisää datareita</title> @stop @section('tyyli') <link rel="stylesheet" type="text/css" href="../css/tyyli.css"> <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> @stop @section('navi') <div id="logout"> <a href="auth/logout" class="nav">kirjaudu ulos</a><br> @stop @section('content') <h1>lisää datareita</h1> <h2>käyttäjälle $user->name</h2> <form method="post" action="storedatari"> <input type="hidden" name="_token" value=" csrf_token() "> <input type="hidden" name="_token" value=" csrf_token() "> <input type="hidden" name="user_id" value="$user->id"> @if (count($errors) > 0) <div class="alert alert-danger">
42 <strong>whoops!</strong> There were some problems with your input.<br><br> <ul> @foreach ($errors->all() as $error) <li> $error </li> @endforeach </ul> @endif <div class="form-group"> <label for="amount"> Määrä</name> <input class="form-control" id="amount" type="number" name="amount" value="old('amount')"> <div class="form-group"> <label for="source">lähde</name> <select name="source" class="form-control"> <option value="paikalla">läsnäolo</option> <option value="tehtava">tehdyt tehtävät</option> <option value="kaytos">käytös</option> <option value="tyonjohto">työnjohdon tehtävät</option> <option value="ajoissa">myöhästyminen</option> <option value="pelaaminen">pelaaminen</option> <option value="kopiointi">kopiointi</option> </select> <div class="form-group"> <label for="course">kurssi </name> <select class="form-control" id="course" name="course"> <option value="yrityksessa_toimiminen">yrityksessä toimiminen</option> <option value="julkiset_tietoverkot">julkiset tietoverkot</option> <option value="grafiikka">grafiikka</option> </select> <div> <button type="submit" class="btn btn-default">lisää</button> </form> @stop
43 osa 7 käyttöönotto
7 Laravel-sovellus web-hotellin alidomainiin 44 Jos laitat sovelluksen päädomainiin, vähennä../.:n määrää 7.1 Laravel-kansio domainiin www-juurta ylemmäksi Asenna Laravel www-juuren kanssa rinnakkaiseen kansioon: domain.com/ ----->datarit/ ----->[muut kansiot] ----->public_html/ ----------->[muut kansiot] ------------>datarit/ 7.2 Laravelin public-kansio alidomainin juureen Alidomainin kansioon (tässä) /public_html/datarit/) sijoitetaan Laravelin "public/" kansio. 7.3 paths.php ja index.php -muunnokset Muunna 2 tiedostoa: Laravelin /bootstrap/paths.php ja /public/index.php. 7.3.1 paths.php seuraavat korvaukset: 'app' => DIR.'/../app', korvataan 'app' => DIR.'/../../laravel/app', 'public' => DIR.'/../public', korvataan 'public' => DIR, 'base' => DIR.'/..', korvataan 'base' => DIR.'/../../laravel', 'storage' => DIR.'/../app/storage', korvataan 'storage' => DIR.'/../../laravel/app/storage' 7.3.2 index.php seuraavat korvaukset: require DIR.'/../bootstrap/autoload.php'; korvataan require DIR.'/../../laravel/bootstrap/autoload.php'; $app = require_once DIR.'/../bootstrap/start.php'; korvataan $app = require_once DIR.'/../../laravel/bootstrap/start.php'; 7.3.3 Päivitä lisäksi tietokannan konfiguraatio.