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.

Starta ett nytt projekt

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]);
    }
}
⚠️ **GitHub.com Fallback** ⚠️