Laravel 5.14 by Dummy

Samankaltaiset tiedostot
Tapahtumakalenteri & Jäsentietojärjestelmä Ylläpito

XHTML - harjoitus. Tehtävä1: Tee xhtml tiedosto käyttäen notepad (muistio) ohjelmaa. Tiedoston tallennus notepad (muistio) ohjelmassa:

Alkuun HTML5 peliohjelmoinnissa

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Kylänetti projektin sivustojen käyttöohjeita Dokumentin versio 2.10 Historia : 1.0, 1.2, 1.6 Tero Liljamo / Deserthouse, päivitetty 25.8.

Verkkosivut perinteisesti. Tanja Välisalo

FinFamily PostgreSQL installation ( ) FinFamily PostgreSQL

Paavo Räisänen. WampServer palvelimen asennus ja käyttö Eclipsen kanssa, sekä ensimmäinen FTP yhteys.

WWW-PALVELUN KÄYTTÖÖNOTTO LOUNEA OY

/ * PROSESSORIN C-KIELINEN OHJELMA */


Tutkitaan sitten HTML-dokumenttien anatomiaa, jotta päästään käsiksi rakenteisten dokumenttien käsitteistöön esimerkkien kautta.

Webpalvelin muistitikulle - Ohje

EASY Tiedostopalvelin - mobiilin käyttöopas

HTML & CSS. HTML (HyperText Markup Language) Antti Koivisto. ! HTML on sivujen kuvauskieli.

FinFamily Installation and importing data ( ) FinFamily Asennus / Installation

Javascript 2: Ohjelmointikielen ominaisuudet. Jaana Holvikivi Metropolia

Coolselector Asennusohje

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Ohjeita kirjan tekemiseen

Bitnami WordPress - Asenna WordPress koneellesi. Jari Sarja

Esimerkkinä - ilmainen blogi-julkaisujärjestelmä. WordPress:stä on myös palvelimelle asennettava versio (WordPress.

Harjoituksen aiheena on tietokantapalvelimen asentaminen ja testaaminen. Asennetaan MySQL-tietokanta. Hieman linkkejä:

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

LINUX-HARJOITUS, MYSQL

3. Asenna MySQLdb(MySQL-python-1.2.3b4.win32-py2.7.exe) ja pyserial (pyserial- 2.5.win32.exe)

KEMI-TORNIONLAAKSON KOULUTUSKUNTAYHTYMÄ LAPPIA LANGATON VIERAILIJAVERKKO 2(7) VERKKOYHTEYDEN MÄÄRITTELY WINDOWS XP:LLE (WINDOWS XP SP3)

Lisätehtävät. Frantic 2015 sivu 1

JWT 2016 luento 11. to klo Aulikki Hyrskykari. PinniB Aulikki Hyrskykari

F-Secure KEY salasanojenhallintaohjelman käyttöönotto Mac -laitteella

Web Services tietokantaohjelmoinnin perusteet

TW-LTE 4G/3G. USB-modeemi (USB 2.0)

Metsästyskerhon koiratietokannan suunnittelu ja toteutus

SSH Secure Shell & SSH File Transfer

Visma Econet -ohjelmat ActiveX on epävakaa -virheilmoituksen korjausohjeet

1. Liikkuvat määreet

Proseduraalinen dokumentti: sisältö, rakenne ja ulkoasu yhdessä, esim. worddokumentti

XNA grafiikka laajennus opas. Paavo Räisänen. Tämän oppaan lähdekoodit ovat ladattavissa näiden sivujen Ladattavat osiossa.

Javan asennus ja ohjeita ongelmatilanteisiin

Käytin tehtävän tekemiseen Xubuntu käyttöjärjestelmää aikaisemmin tekemältäni LiveUSB-tikulta.

Written by Administrator Saturday, 28 August :51 - Last Updated Tuesday, 22 February :45

Odoo ERP, Käyttäjien määrittely

Webinaariin liittyminen Skype for

Aloita oman blogisi luominen (järjestelmä lupaa sen tapahtuvan sekunneissa ;-))

F-Secure KEY salasanojenhallintaohjelman käyttöönotto PC -laitteella

Kirjasto Relaatiotietokannat Kevät Auvinen Annemari Niemi Anu Passoja Jonna Pulli Jari Tersa Tiina

Ohjelmoinnin peruskurssi Y1

Wordpress-julkaisualusta. Mediatekniikan seminaari Harri Viitala

CLOUDBACKUP TSM varmistusohjelmiston asennus

Lab A1.FARM_Hyper-V.v3

Sisällysluettelo Table of contents

Eclipse 3.1 Pikaopas versio 1.0

Skype for Business pikaohje

PHPMyAdmin. MySQL-tietokannan hallintatyökalu. Antti Järvinen Ville Pietarinen

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Kaakkois-Suomen Ammattikorkeakoulu Oy Mikkelin Ammattikorkeakoulu Oy Kymenlaakson Ammattikorkeakoulu Oy

PAROC CALCULUS LASKENTAOHJELMA TIETOKONEELLE ASENNETTAVA VERSIO. Latausohjeet Asennusohjeet

Käyttäjätunnus Användarnamn Username. Salasana Lösenord Password. Kieli Språk Language. Kirjaudu sisään / Logga in / Login

HAMINETTI WLAN LIITTYMÄN KÄYTTÖÖNOTTO-OHJE

Toisessa viikkoharjoituksessa on tavoitteena tutustua JUnit:lla testaukseen Eclipse-ympäristössä.

PRINTER DRIVER PÄÄKÄYTTÄJÄN OPAS

Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen

You can check above like this: Start->Control Panel->Programs->find if Microsoft Lync or Microsoft Lync Attendeed is listed

Kirkkopalvelut Office365, Opiskelijan ohje 1 / 17 IT Juha Nalli

Sivupohja flat file julkaisujärjestelmälle. Kirjoittanut Jari Sarja (

5. HelloWorld-ohjelma 5.1

TAITAJA 2007 ELEKTRONIIKKAFINAALI KILPAILIJAN TEHTÄVÄT. Kilpailijan nimi / Nro:

HAME PostGIS-tietokanta

Luento 5. Timo Savola. 28. huhtikuuta 2006

SENAATTILA uudistuu keväällä 2015

ohjeita kirjautumiseen ja käyttöön

Transkribuksen pikaopas

Lab SBS3.FARM_Hyper-V - Navigating a SharePoint site

T&M Autori Versio Series 60 -puhelimiin

compass tool - käyttöohje - järjestelmänvalvojille

Pedacode Pikaopas. Web-sovelluksen luominen

Päivitysohje Opus Dental

AXXION OY. Hosting-palvelut Asiakasohjeistus Versio 1.0

Novapoint Lisensiointi. Copyright 2006, ViaNova IT AS. All rights reserved 1

Ohjelmoinnin perusteet Y Python

Microsoft SQL Server -tietokannan hallinta. Jouni Huotari

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Open Badge -osaamismerkit

2 3 LIITE 2. Index.php 1 (10) 4 5 <?php 6 7 /*! \mainpage Artikkelihallintaohjelma 8 * 9 * \section intro_sec Introduction 10 * 11 * Tämän on

erasmartcard-kortinlukijaohjelmiston asennusohje (mpollux jää toiseksi kortinlukijaohjelmistoksi)

SuomiCom-sähköpostiasetukset Microsoft Outlook 2016

Mathcad 14.0 Single User -asennus

Ohjeet asiakirjan lisäämiseen arkistoon

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Järjestelmän syötteet ja tulosteet Kohahdus Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Selvitysraportti. MySQL serverin asennus Windows ympäristöön

SELVITYSRAPORTTI LABRA-VERKON MYSQL:n JA PHP:n KÄYTTÖÖNOTOSTA. Jarkko Kähkönen

erasmartcardkortinlukijaohjelmiston

Storage IT EASY Tiedostopalvelimen kustomointi

Outlook Office 365. Tässä ohjeessa kuvataan miten sähköpostitili (IMAP) sekä Kotisivut.com Autentikoiva SMTPlisäpalvelu

Tässä ohjeessa käydään läpi sosiaalisen median verkkopalveluiden lisätoimintojen lisääminen verkkosivuillesi.

HTML-ohjeet. Sivun perusrakenne <HTML> <HEAD> <STYLE TYPE="text/css"> ...tänne tulee CSS-koodi eli sivun ulkonäkö määritykset...

Erittäin nopea tapa saada kehitysympäristö php:lle pystyyn Voidaan asentaa muistitikulle

HTML:n perusteet. Jari Sarja / Otavan Opisto Tämä oppimateriaali on lisensoitu Creative Commons Nimeä-Tarttuva 3.

Asennusohje. Sahara-ryhmä. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Transkriptio:

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.