Uppgift: Mina filmer - osadi/yrgo GitHub Wiki
Skapa en applikation för att hantera filmer. I steg 1 kommer vi att ha en vy som visar en lista med filmer, och en vy som visar en enskild film.
Känner du dig bekväm i detta så byt gärna ut filmer mot något eget och testa att lägga till fler olika fält i databasen och ta ut kreativiteten i dina vyer.
Steg 1 - Förbered miljön.
Steg 2 - Definiera strukturen för din app.
Vi kommer att ha en sökväg för att lista filmerna, och en sökväg för en enskild film.
/movies
& /movies/{slug}
get('/', 'MoviesController@index');
get('movies/{slug}', 'MoviesController@show');
Steg 3 - Skapa en Controller
php artisan make:controller MoviesController --plain
Steg 4 - Skapa metoder för att visa vyerna
public function index()
{
return view('movies.index');
}
public function show($slug)
{
return view('movies.show');
}
Steg 5 - Skapa våra vyer
master.blade.php
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
<link href="{{ asset('/css/app.css') }}" rel="stylesheet">
<!-- Fonts -->
<link href='//fonts.googleapis.com/css?family=Roboto:400,300' rel='stylesheet' type='text/css'>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="row">
<div class="col-xs-12">
<h1>Mina goa filmer</h1>
</div>
</div>
<div class="row">
@yield('body')
</div>
</div>
<!-- Scripts -->
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
</body>
</html>
index.blade.php
@extends('master')
@section('body')
<div class="col-xs-12">
@foreach($movies as $movie)
<h2>
<a href="{{ action('MoviesController@show', [$movie->slug]) }}"> {{ $movie->title }}</a>
</h2>
<p>{{ $movie->summary }}</p>
@endforeach
</div>
@stop
show.blade.php
@extends('master')
@section('body')
<div class="col-xs-12">
<h2>{{ $movie->title }}</h2>
<p>{{ $movie->summary }}</p>
<a href="{{ action('MoviesController@index') }}">Tillbaka</a>
</div>
@stop
Steg 6 - Skapa vår modell och vår migration
php artisan make:model Movie
Lägg till fälten vi vill ha i vår migration
public function up()
{
Schema::create('movies', function(Blueprint $table)
{
$table->increments('id');
$table->string('title', 30);
$table->string('slug', 20)->unique();
$table->text('summary');
$table->timestamps();
});
}
public function down()
{
Schema::drop('movies');
}
Kör vår migration
php artisan migrate
Sist lägger vi till fälten som fillable i vår modell:
protected $fillable = [
'title',
'slug',
'summary',
];
Steg 7 - Lägg till data med hjälp av tinker
php artisan tinker
Psy Shell v0.4.1 (PHP 5.6.6-1+deb.sury.org~utopic+1 — cli) by Justin Hileman
>>> App\Movie::create(['title' => 'Pulp Fiction', 'slug' => 'pulp-fiction', 'summary' => 'Jules Winnfield and Vincent Vega are two hitmen who are out to retrieve a suitcase stolen from their employer, mob boss Marsellus Wallace.']);
Steg 7a - (Optional) Lägg till data med hjälp av en databas seeder
Först behöver vi skapa en ny Seeder class. Det gör vi i mappen database/seeds och vi kallar den för MoviesTableSeeder.php
I den så skriver vi:
<?php
use Illuminate\Database\Seeder;
class MoviesTableSeeder extends Seeder {
public function run()
{
// Kommentera denna för att inte radera all data i tabellen
DB::table('movies')->delete();
$movies = array(
[
'id' => 1,
'title' => 'Pulp Fiction',
'slug' => 'pulp-fiction',
'summary' => "The lives of two mob hit men, a boxer, a gangster's wife, and a pair of diner bandits intertwine in four tales of violence and redemption.",
'created_at' => new DateTime,
'updated_at' => new DateTime,
],
[
'id' => 2,
'title' => '2001: A Space Odyssey',
'slug' => '2001-a-space-odyssey',
'summary' => "Humanity finds a mysterious, obviously artificial, object buried beneath the Lunar surface and, with the intelligent computer H.A.L. 9000, sets off on a quest.",
'created_at' => new DateTime,
'updated_at' => new DateTime
],
);
DB::table('movies')->insert($movies);
}
}
Sen talar vi om för vår seeder att vi ska köra just denna klassen. Filen ligger under database\seeds och heter DatabaseSeeder.php.
public function run()
{
Model::unguard();
$this->call('MoviesTableSeeder');
$this->command->info('Movies table seeded!');
}
Sen får vi tala om för composer, som autoladdar våra klasser, att det finns en ny klass:
composer dump-autoload
Sen så kör vi vår seed:
php artisan db:seed
Steg 8 - Redigera vår kontroller för att hämta datan
use App\Movie;
class MoviesController extends Controller {
public function index()
{
$movies = Movie::all();
return view('movies.index', ['movies' => $movies]);
}
public function show($slug)
{
$movie = Movie::where(['slug' => $slug])->first();
return view('movies.show', ['movie' => $movie]);
}
}