Laravel入門覚書1: Laravelの基本を理解しよう

# Laravel入門覚書1: Laravelの基本を理解しよう



-------------------------------------------------------------
## 01:Laravelの基本を理解しよう 
ここでは、この講座の目的・対象者・学習の進め方を確認します。それから、Laravelの特徴についても学習します。

 Webアプリケーションフレームワークとは
Webアプリを開発するために便利な部品やツールをひとまとめにしたもの。
Webアプリケーションを短期間に効率よく開発できる。


Laravelの特徴
- テンプレートエンジン(Blade)
- データベース(O/Rマッパー：Eloquent)
- 対話型コンソール(artisan tinker)
- ユーザー認証 など



 参考になるWebページ
### 公式・総論

Laravel - The PHP Framework For Web Artisans
https://laravel.com/

Laravel - ウェブ職人のためのPHPフレームワーク
http://laravel.jp/

Laravel ドキュメント
https://readouble.com/laravel/

Laravel - Wikipedia
https://ja.wikipedia.org/wiki/Laravel


### チュートリアル

Laravel入門: 初心者でも10分でWebサービスを作れる！
PHPフレームワークLaravelとPaizaCloudの使い方 - paiza開発日誌
https://paiza.hatenablog.com/entry/2018/02/16/paizacloud_laravel

Laravel学習帳 - はじめてのLaravel入門サイト -
http://laraweb.net/

Laravel5でシンプルなCRUDアプリを開発する - アシアルブログ
http://blog.asial.co.jp/1360


### 評価

Laravelのここがすごい - Qiita
https://qiita.com/nunulk/items/78d70ac809948b470bbc

Laravelの開発で感じたメリットとデメリットをまとめてみた
ぐるなびをちょっと良くするエンジニアブログ
http://developers.gnavi.co.jp/entry/laravel-2

Laravelでウェブアプリケーションをつくるときのベストプラクティスを探る - Qiita
https://qiita.com/nunulk/items/b1e2da51b5dabab92da0

-------------------------------------------------------------


## 02:アプリケーションを用意しよう 
ここでは、Laravelを使う準備として、アプリケーション用ディレクトリを用意します。Laravelでは、このディレクトリに、アプリケーションに必要な機能を作り込んでいきます。また、このディレクトリを用意するだけで、Webサーバーを起動して、動作を確認できます。

####このチャプターで使用したコマンド
カレントディレクトリの確認

$ pwd


ディレクトリの一覧
$ ls


PHPのバージョンを確認
$ php -v


Laravelのバージョンを確認
$ laravel -V


 アプリケーション用ディレクトリを自動生成する

$ laravel new bbs



####ディレクトリ作成を高速化するには
"laravel new"コマンドの実行前に以下のような設定をしておけば、コマンドの実行時間を短くできます。


$ composer config -g repositories.packagist composer 'https://packagist.jp'
$ composer global require hirak/prestissimo


####Webサーバーを起動

$ cd bbs
$ php artisan serve


####ブラウザで以下にアクセスすると、アプリのWebページを表示する

https://localhost:8000/


なお、LaravelのサーバはHTTPで動作していますが、PaizaCloudではこれをHTTPSに変換しています。またサーバはlocalhostで動作していますが、PaizaCloudでは"https://localhost-サーバ名.paiza-user.cloud:ポート番号"というURLでlocalhostに接続できるようになっています。

Webサーバーを停止するには、ターミナルで、キーボードで「CTRL」キー(コントロールキー)を押しながら「C」のキーを押す。


#### Artisanとは
ターミナルで「artisan」(アーティサン)コマンドを使ってLaravelの機能を呼び出すことができます。LaravelでWebアプリケーションを開発するときに役に立つ、数多くのコマンドを提供しています

-------------------------------------------------------------
演習課題「Laravelのアプリケーションディレクトリを作成する」
右のターミナルで、現在のディレクトリに「myblog」というLaravelのアプリケーションディレクトリを作成してください。

laravel new myblog


演習課題「Laravelサーバーを起動する」
LaravelのWebサーバーを起動してください。

php artisan serve

-------------------------------------------------------------

##03:Laravel で HelloWorld 
ここでは、Laravelのアプリケーションで簡単なメッセージを表示します。Hello Worldを表示して、Laravelでアプリケーションを作るための基本操作を理解しましょう。

 Welcomeページを修正する
bbs/resources/views/welcome.blade.php

<div class='title m-b-md'>
    paiza bbs
</div>
<p><?= date('Y/m/d H:i:s') ?></p>


-------------------------------------------------------------
 演習課題「Welcomeページを修正する」
右の環境には、Laravelで「myblog」というアプリケーションのディレクトリを作ってあります。

このアプリケーションのwelcome.blade.phpを修正して、以下のタイトルを表示するようにしてください。

```
Hello paiza
```


模範解答1
bbs/resources/views/welcome.blade.phpの'Laravel'を変更する

                <div class="title m-b-md">
                    Hello paiza
                </div>
                
                
-------------------------------------------------------------
##04:1行掲示板を作ろう 
ここでは、Laravelで作る1行掲示板の概要を整理します。また、掲示板で必要になるデータベースを準備しましょう。

 データベース構成
1行掲示板のデータベースには、次の情報が必要になります。

- データベース : mybbs
- テーブル : articles
- カラム : id, content, created_at, updated_at

このデータベースは、phpMyAdminで用意しておきます。


 アプリケーションのデータベース設定
アプリケーションからデータベースを呼び出すには、次のデータベース設定が必要です。

「.env」ファイルは、隠しファイルになっているので、「bbs」ディレクトリを右クリック->「隠しファイルを表示」で表示しておきます。

bbs/.env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=mybbs
DB_USERNAME=root
# DB_PASSWORD=secret


-------------------------------------------------------------

演習課題「Laravelのデータベース環境を設定する」
右の環境では、「myblog」というLaravelのアプリケーションディレクトリを作成してあります。また、MySQLに「myblog」用のデータベース「myblogdb」が作成してあります。

laravelの環境設定ファイルに以下の情報を入力して、このデータベースにアプリケーションから接続できるようにしてください。

- DB_DATABASE=myblogdb
- DB_USERNAME=root
- DB_PASSWORD=(不要)

採点して、すべてのジャッジに正解すれば、演習課題クリアです！



模範解答1
隠しファイルの「.env」に設定情報を入力する
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=myblogdb
DB_USERNAME=root
# DB_PASSWORD=secret


-------------------------------------------------------------

##05:モデルとコントローラを用意する 
ここでは、Laravelから１行掲示板のデータベースを操作するモデルを用意します。モデルを使うと、PHPのオブジェクトとして、データベースのレコードを操作できるようになります。

 モデルとマイグレーション、コントローラを作成

$ cd bbs
$ php artisan make:model Article -m -c -r


 contentカラムを追加
database/migrations/2018_xx_xx_xxxxxxxx_create_articles_table.php

public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->increments('id');
            $table->string('content');
            $table->timestamps();
        });
    }
    
    
マイグレーション実行

$ php artisan migrate


 参考になるWebページ
【Laravel】わりとよく使うArtisanコマンド集 - Qiita
https://qiita.com/sola-msr/items/a09b857c5e7f7c88d01d




-------------------------------------------------------------


演習課題「モデルにカラムを追加しよう」
右の環境には、Laravelの「myblog」というアプリケーションを作成してあります。また、MySQLに「myblogdb」というデータベースを作成してあります。

このアプリケーションに、Diaryという名前のモデルとコントローラ・マイグレーションファイルを自動生成して、Diaryテーブルに「topic」というカラムを追加してください。

手順は次の通りです。

- モデルとコントローラ・マイグレーションファイルを自動生成する
- マイグレーションファイルに「topic」カラムを追加する
- 生成したマイグレーションファイルの設定をデータベースに反映する

採点して、すべてのジャッジに正解すれば、演習課題クリアです！



模範解答1
php artisan make:model Diary -m -c -rで、各ファイルを自動生成

```
    public function up()
    {
        Schema::create('diaries', function (Blueprint $table) {
            $table->increments('id');
            $table->string('topic');
            $table->timestamps();
        });
    }
```
    


-------------------------------------------------------------

##06:ルーティングを定義しよう 
ここでは、Laravelの1行掲示板のルーティングを設定します。ルーティングを使うことで、特定のアドレスにアクセスした時、どの機能を呼び出すか設定できます。

 ルーティングとは
どのアドレスにアクセスした時、どの機能を呼び出すか設定できます。LaravelによるWebアプリケーションでは、機能に応じて、アドレスを割り当てておきます。そして、ルーティングで、リクエストに応じて実行するコードを切り替えます。



1行掲示板のルーティング(一覧画面、詳細画面)
bbs/routes/web.php

Route::get('/', function () {
    return view('welcome');
});

Route::get('/articles', 'ArticleController@index')->name('article.list');
Route::get('/article/{id}', 'ArticleController@show')->name('article.show');




 paiza-cloud用https対応
app/Providers/AppServiceProvider.php

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        \URL::forceScheme('https');
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}


-------------------------------------------------------------
 演習課題「ルーティングを設定する」
右の環境には、Laravelで「myblog」というアプリケーションを作ってあります。

このアプリケーションのルーティングを設定して、以下のURLで、「DiaryController」(ダイアリーコントローラ)のindexメソッドを呼び出すようにしてください。

```
https://localhost:8000/diary
```

ブラウザで表示した際に、404エラーが発生していなければ問題ありません。


模範解答1
myblog/routes/web.phpに、ルートを追加する

Route::get('/diary', 'DiaryController@index')->name('diary.list');


-------------------------------------------------------------

##07:コントローラとビューを作成しよう 
ここでは、Laravelの1行掲示板のために、コントローラとビューを作成します。そして、プログラムを制御するコントローラと、ページの見た目を記述するビューの使い方を学習します。

 コントローラからデータを渡す
/bbs/app/Http/Controllers/ArticleController.php:

<?php

namespace App\Http\Controllers;

use App\Article;
use Illuminate\Http\Request;

class ArticleController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $message = 'Welcome my BBS';
        return view('index', ['message' => $message]);
    }
}




 ビューでデータを表示する
/bbs/resources/views/index.blade.php

<!DOCTYPE html>
<html>
    <head>
        <meta charset='utf-8'>
        <title>paiza bbs</title>
        <style>body {padding: 10px;}</style>
    </head>
    <body>
        <h1>paiza bbs</h1>
        <p>{{ $message }}</p>
    </body>
</html>


-------------------------------------------------------------

演習課題「コントローラからビューを呼び出す」
右の環境には、Laravelで「myblog」というアプリケーションを作ってあります。

このアプリケーションで、以下のURL(ユーアールエル)にアクセスしたら、ビューの「index.blade.php」を呼び出して表示するように、コントローラのindexメソッドを修正してください。

```
https://localhost:8000/diary
```

採点して、すべてのジャッジに正解すれば、演習課題クリアです！


模範解答1
~/myblog/app/Http/Controllers/DiaryController.phpのindexメソッドで、indexビューを呼び出す

    public function index()
    {
        return view('index');
    }
    
-------------------------------------------------------------
演習課題「コントローラからビューにデータを渡す」
右の環境には、Laravelで「myblog」というアプリケーションを作ってあります。このアプリケーションでは、以下のURL(ユーアールエル)にアクセスしたら、ビューの「index.blade.php」を呼び出して表示するようになっています。

コントローラのindexメソッドを修正して、$message変数をビューに渡すようにしてください。
また、コントローラから渡された$message変数をpタグで表示するようにindex.blade.viewを書き換えてください。

```
https://localhost:8000/diary
```

採点して、すべてのジャッジに正解すれば、演習課題クリアです！



 模範解答1
indexメソッドで、view関数の引数に、['message' => $message] を追加し、index.blade.phpに<p>{{ $message }}</p>を追加する


// DiaryController.php
    public function index()
    {
        $message = 'Welcome to my page!';
        return view('index', ['message' => $message]);
    }

// index.blade.php
    <body>
        <h1>myblog Index Page</h1>
        <p>{{ $message }}</p>
    </body>
    
    
-------------------------------------------------------------

##08:記事一覧を作成しよう 
ここでは、1行掲示板の記事一覧を作成します。そのために、コントローラで、モデルからデータ一覧を取り出して、ビューで一覧表示します。

 コントローラで、記事一覧を取得する
/bbs/app/Http/Controllers/ArticleController.php:

<?php

namespace App\Http\Controllers;

use App\Article;
use Illuminate\Http\Request;

class ArticleController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $message = 'Hello world';
        $articles = Article::all();
        return view('index', ['message' => $message, 'articles' => $articles]);
    }

}



 ビューで記事一覧を表示する
/bbs/resources/views/index.blade.php

<!DOCTYPE html>
<html>
    <head>
        <meta charset='utf-8'>
        <title>paiza bbs</title>
        <style>body {padding: 10px;}</style>
    </head>
    <body>
        <h1>paiza bbs</h1>
        <p>{{ $message }}</p>
        @foreach ($articles as $article)
            <p>{{ $article->content }}</p>
        @endforeach
    </body>
</html>


-------------------------------------------------------------


演習課題「MyBlogのデータ一覧を表示しよう」
右の環境には、Laravelで「myblog」というアプリケーションを作ってあります。このアプリケーションで、以下のURL(ユーアールエル)にアクセスしたら、ビューの「index.blade.php」を呼び出して表示します。

```
https://localhost:8000/diary
```

このアプリケーションを修正して、「myblog」アプリケーションのサンプルデータ一覧を表示するよう、DiaryController.phpのindexメソッドを修正してください。一覧データの変数名はdiariesとします。
また、index.blade.phpを編集して、pタグで一覧データのtopicを表示してください。

採点して、すべてのジャッジに正解すれば、演習課題クリアです！



模範解答1
/bbs/app/Http/Controllers/DiaryController.phpのindexメソッドで、データベースの全てのデータを取得して、diariesに代入する。foreachで一覧データのtopicを全て表示する。


// DiaryController.php
    public function index()
    {
        $message = 'Welcome to my page!';
        $diaries = Diary::all();
        return view('index', ['message' => $message, 'diaries' => $diaries]);
    }

// index.blade.php
    <body>
        <h1>myblog Index Page</h1>
        <p>{{ $message }}</p>
        @foreach ($diaries as $diary)
            <p>{{ $diary->topic }}</p>
        @endforeach
    </body>
    
    
    
-------------------------------------------------------------


##09:詳細画面を作ろう 
ここでは、1行掲示板の記事を個別表示する画面を作成します。そのために、コントローラで、モデルから、指定したデータを取り出して、ビューで表示します。

 コントローラのshowメソッドで、特定の記事を取り出す
/bbs/app/Http/Controllers/ArticleController.php:

public function show(Request $request, $id, Article $article)
{
    $message = 'This is your article ' . $id;
    $article = Article::find($id);
    return view('show', ['message' => $message, 'article' => $article]);
}



showビューで、指定の記事を表示する
/bbs/resources/views/show.blade.php

<!DOCTYPE html>
<html>
    <head>
        <meta charset='utf-8'>
        <title>paiza bbs</title>
        <style>body {padding: 10px;}</style>
    </head>
    <body>
        <h1>paiza bbs</h1>
        <p>{{ $message }}</p>
        <p>{{ $article->content }}</p>

        <p>
            <a href={{ route('article.list') }}>一覧に戻る</a>
        </p>
    </body>
</html>


記事一覧から個別の記事にリンクする
/bbs/resources/views/index.blade.php

<!DOCTYPE html>
<html>
    <head>
        <mata charset="utf-8">
        <title>paiza bbs</title>
        <style>body {padding: 10px;}</style>
    </head>
    <body>
        <h1>paiza bbs</h1>
        <p>{{ $message }}</p>
        @foreach ($articles as $article)
            <p>
                <a href='{{ route("article.show", ["id" =>  $article->id]) }}'>
                    {{ $article->content }}
                </a>
            </p>
        @endforeach
    </body>
</html>


-------------------------------------------------------------

演習課題「MyBlogの特定データを表示しよう」
右の環境には、Laravelで「myblog」というアプリケーションを作ってあります。このアプリケーションで、以下のURL(ユーアールエル)にアクセスしたら、ビューの「index.blade.php」を呼び出して表示します。

```
https://localhost:8000/diary
```

このアプリケーションに、以下のURLで「myblog」アプリケーションの特定データを表示するよう、DiaryController.phpのshowメソッドを修正してください。一覧データの変数名はdiaryとします。

```
https://localhost:8000/diary/(id)
```


模範解答1
/bbs/app/Http/Controllers/DiaryController.phpのshowメソッドで、データベースの指定データを取得して、diaryに代入する。

    public function show(Request $request, $id,  Diary $diary)
    {
        $diary = Diary::find($id);
        return view('show', ['diary' => $diary]);
    }
    
    

-------------------------------------------------------------


参照元：
https://paiza.jp/works/laravel/primer