Laravel5ことはじめ

#はじめに
Laravelを導入してみましたが構成が全然わからないので自分なりの備忘録として作成。
導入手順、環境については[過去の記事](http://qiita.com/tosite0345/items/1e5bbeb33508abb1eaae)を参照。

**2017/02/23追記：**
色々やっているうちにLaravelのバージョンが5.4に上がっちゃうという不測の事態が発生。少し環境が変わっています。

#前提環境
+ Composer 導入済み
+ Laravel 5.4 導入済み
+ MySQL 導入済み
+ PHP 5.6（ + phpmcrypt）導入済み

#Controllerを生成してみる

```bash:console
# プロジェクトルートへ移動
$ cd /var/www/html/sample/

# データ操作に必要なメソッドを生成する場合
$ php artisan make:controller PagesController

# デフォルトメソッドが不要である場合
$ php artisan make:controller --plain PagesController
```
#Controllerからページを表示させる
##概要
ページアクセス時に
routes.php
 web.phpからPagesController.phpを呼び出して、特定のページ（about.blade.php）を表示できるようにしてみる。
アクセス先 : http://**{ localhost or IP }**:8000/about/
##構成
旧環境

<pre>
[/var/www/html/sample]
 |
 +-[resources]
 |  |
 |  +-[views]
 |      |
 |      +-[pages]--about.blade.php
 |
 +-[app]
     |
     +-[Http]--routes.php
         |
         +-[Controllers]--PagesController.php
</pre>

Laravel 5.4環境
<pre>
[/var/www/html/sample]
 |
 +-[resources]
 |  |
 |  +-[views]
 |      |
 |      +-[pages]--about.blade.php
 |
 +-[app]
 |   |
 |   +-[Http]
 |       |
 |       +-[Controllers]--PagesController.php
 |
 +-[routes]--web.php
</pre>

##ソースコード
Laravel 5.4ではroutes.phpがなくなり、代わりにそれぞれの処理に応じたphpファイルroutesディレクトリ内に生成されるようになっていました。

```php:/var/www/html/sample/routes/web.php
<?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::controller("about","PagesController@getIndex"); // Controller名@クラス名で指定
```

```php:/var/www/html/sample/app/Http/Controllers/PagesController.php
<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class PagesController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function getIndex()
    {
        $name = [];
        $name['first_name'] = 'Tetsuro';
        $name['last_name']  = 'Degawa';
        return view("pages.about", $name); // サブディレクトリを参照する場合は「.」でつなぐ 第二引数に連想配列を渡すことでフォーム側から出力できる

    }
}
```

```php:/var/www/html/sample/resources/view/pages/about.blade.php
<?php
    echo "<h1>About: {$first_name} {$last_name}.</h1>";
```
#レイアウトを別に分ける
##概要
about.blade.phpの内容はコンテンツの表示のみに留め、レイアウトを別のところ（layout.blade.php）で管理したい。
##構成
<pre>
[/var/www/html/sample]
 |
 +-[resources]
 |  |
 |  +-[views]--layout.blade.php[!]
 |      |
 |      +-[pages]--about.blade.php
 |
 +-[app]
 |   |
 |   +-[Http]
 |       |
 |       +-[Controllers]--PagesController.php
 |
 +-[routes]--web.php
</pre>
##ソースコード
```php:/var/www/html/sample/routes/web.php
    // 先ほどと変更なし
```
```php:/var/www/html/sample/app/Http/Controllers/PagesController.php
    // 先ほどと変更なし
```
```php:/var/www/html/sample/resources/view/about.blade.php
// 先ほどの記述はすべてコメントアウト
// <?php 
//     echo "<h1>About: {$first_name} {$last_name}.</h1>";

// 代わりに以下を記述
@extends('layout')	// layout.blade.phpを読み込み
@section("content")	// layout.blade.phpのcontentセクションに表示する部分
	<h1>Hello, {{$first_name}} {{$last_name}}.</h1> // 変数を表示する場合は{{ }}で囲う
@endsection			// contentセクション終了
```
```php:/var/www/html/sample/resources/view/layout.blade.php
<!DOCTYPE html>
<html>
<head>
	<title>sample</title>
</head>
<body>
	@yield('content') // contentセクションを表示する部分
</body>
</html>
```
#フォームの作成・値の取得
##概要
Webページの基礎部分となる、フォームの生成と値の取得について記述していきます。
なお、他のサイトでよく利用されているHTMLファサード、FORMファサードは<font color="salmon">Laravel 5.4では標準インストールされていない</font>ため、色々とゴニョゴニョしないと利用できない模様。
実はこのゴニョゴニョしている最中にハマってしまい、プロジェクトを再作成するハメに。Versionが5.4にあがったのはその
せい
おかげです。
今回はプレーンな状態のLaravelでフォームを作成していきます。[ビギナーのためのLaravel入門](http://libro.tuyano.com/index3?id=3786004)を参考にさせていただきました。

今回編集するのは以下の3ファイル。

+ about.blade.php
+ PagesController.php
+ web.php

早速ソースコードを見ていきます。

##ソースコード

```php:about.blade.php
@extends('layout')
@section("content")
    <h1>Hello, {{$login}}.</h1>
@endsection

<form method="post" action='/about'>
    <input type="hidden" name="_token" value="<?php echo csrf_token(); ?>"> // *これを記述しないとCSRFチェックに引っかかる模様
    <input type="text" name="message" placeholder="write message.">
    <input type="submit">
</form>
```
*の部分を記述し忘れると、`TokenMismatchException in VerifyCsrfToken.php line 68:`とかいうエラーが表示されます。
[こちら](http://start-now.link/100/archives/3133)を参考にさせていただきました。

```php:PagesContloller.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class PagesController extends Controller
{
    // getIndex : フォームに何も入力されていないときに表示
    public function getIndex()
    {
        $data = [];
        $data["login"] = "Please Login.";
        $data["message"] = 'please type message.';
        return view("pages.about", $data);
    }

    // フォーム側Submitボタンが押されたときに表示
    public function postIndex(Request $request)
    {
        $data = [];
        $data["login"]  = "Hello, Tetsuro Degawa.";
        $data['message'] = $request->input('message'); // フォームからPostされた値を取得
        return view("pages.about", $data);
    }
}
```

```php:web.php
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
    return view('welcome');
});
Route::get("about", "PagesController@getIndex");
Route::post("about","PagesController@postIndex");
```
web.phpにgetとpostの処理を分けてあげたらフォームの値を取得できるようになりました。

#テーブルの作成
##概要
Laravelは直接テーブルを生成するのではなく、Artisanからマイグレーションファイルを作成します。
その後マイグレーションを実行することでテーブルが生成される、という流れのようです。
「マイグレーションファイル」が<font color="salmon">テーブルの設計書</font>で、その設計書を元にテーブルを作成するのが「マイグレーション実行」ということのようです。難解。
マイグレーションが実行可能になるまで紆余曲折がありましたが、詳しい話は[こちら（現在執筆中）]()をご覧ください。
##構成
<pre>
[sample]--artisan
 |
 +-[database]
    |
    +-[migrations]--{timestamp}_create_users_table
</pre>
##マイグレーションファイルの生成

```bash:console[/var/www/html/sample/]
# マイグレーションファイル生成
$ php artisan make:migration create_users_table

# マイグレーションファイルを確認
$ cd ./database/migrations/
$ ls

# vimでマイグレーションファイルを編集
$ vim {timestamp}_create_users_table.php
```
ここで中身を見てみると、関数が2つ生成されていました。
up()がテーブル生成や処理の追加、down()がテーブル削除や処理の取り消しを行っているようです。
今回はテーブルを生成する処理のため、up()内に追記していきます。

```php:/var/www/html/sample/database/migration/{timestamp}_create_users_table
    // 修正前
    public function up()
    {
    }

    // 修正後
    public function up()
    {
        Schema::create('users' /* テーブル名 */, function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('user_name');
            $table->string('user_address');
            $table->string('user_photo');
        });
    }
```
##マイグレーション実行
```bash:console[/var/www/html/sample/]
$ php artisan migrate
```
これでDBにテーブルが生成されました！確かに環境を構築するまでは大変だけど、一度作ってしまうと後がラクになりそうですね。
データベースとマイグレーションについては[ReaDoubleさん](https://readouble.com/laravel/5.1/ja/migrations.html)に詳しい記述があります。

#MySQLと連携して簡単なWebアプリを動かす
現在作業中です。

```php:sample
foreach ($users as $user) {
    echo $user->name;
}
```
[http://blog.hrendoh.com/using-form-and-html-in-laravel5/]
[https://laravel10.wordpress.com/2015/03/08/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AElaravel-5-16-form%E3%81%AE%E4%BD%9C%E6%88%90/]

#参考文献
+ [初めてのLaravel（PHP Framework）](http://qiita.com/shosho/items/a5a5839735dfef9214b1)
+ [Laravel 5.1 データベース：マイグレーション](https://readouble.com/laravel/5.1/ja/migrations.html)
+ [はじめての LARAVEL 5.1](https://laravel10.wordpress.com/category/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE-laravel-5-1/)
+ [「ビギナーのためのLaravel入門」グループ ](http://libro.tuyano.com/index2?id=3766003)