Laravel5のお勉強 -第二回 Controllerの追加-

# Laravel5のお勉強
[第一回 環境構築](http://qiita.com/yu_eguchi/items/0426ea0a41489e96dd33)
[第二回 ControllerとViewの追加](http://~)
[第三回 Database連携(Mysql)](http://qiita.com/yu_eguchi/items/e272a8d34e714f8249df)
[第四回 モデルの作成/tinker紹介](http://qiita.com/yu_eguchi/items/419a2a081ff142ecf67f)
[第五回 テストデータの挿入/Fakerの使用](http://qiita.com/yu_eguchi/items/9af6eed45e14505f6ecc)
[第六回 CRUDの作成](http://~)
[第七回 Herokuにdeploy](http://qiita.com/yu_eguchi/items/34fce39a07c79591f4af)

# 第一回 環境構築-
## 前提条件
Mac OS yosemite
PHP 5.5以上
Mysql 5.6以上

## 目的
Laravel5のお勉強。
[ここ](http://laravel.jp/)が公式の日本語翻訳サイト

今回はコマンドを利用して簡単にCOntrollerを追加すること

## 使用技術
* Laravel5(FW)
* Heroku(deploy)
* Eloquent(ORM)
* Blade(テンプレートエンジン)
* tinker(REPL (Read-Eval-Print Loop))※対話型
* Faker(テストデータ挿入)

## 前回の解説

[前回](http://qiita.com/yu_eguchi/items/0426ea0a41489e96dd33)で環境構築が完成し、
Laravel5のようこそ画面が表示されました。

「http://localhost:8000」にアクセスしたので、URLパターンとしては、ドキュメントルートの「/」となります。
Laravel5のtree構成は以下となっています。

```
Blog
├── app
│   ├── Article.php
│   ├── Console
│   │   ├── Commands
│   │   │   └── Inspire.php
│   │   └── Kernel.php
│   ├── Events
│   │   └── Event.php
│   ├── Exceptions
│   │   └── Handler.php
│   ├── Http
│   │   ├── Controllers
│   │   │   ├── Auth
│   │   │   │   ├── AuthController.php
│   │   │   │   └── PasswordController.php
│   │   │   └── Controller.php
│   │   ├── Kernel.php
│   │   ├── Middleware
│   │   │   ├── Authenticate.php
│   │   │   ├── EncryptCookies.php
│   │   │   ├── RedirectIfAuthenticated.php
│   │   │   └── VerifyCsrfToken.php
│   │   ├── Requests
│   │   │   └── Request.php
│   │   └── routes.php
│   ├── Jobs
│   │   └── Job.php
│   ├── Listeners
│   ├── Policies
│   ├── Providers
│   │   ├── AppServiceProvider.php
│   │   ├── AuthServiceProvider.php
│   │   ├── EventServiceProvider.php
│   │   └── RouteServiceProvider.php
│   └── User.php
├── artisan
├── bootstrap
│   ├── app.php
│   ├── autoload.php
│   └── cache
│       └── services.json
├── composer.json
├── composer.lock
├── config
│   ├── app.php
│   ├── auth.php
│   ├── broadcasting.php
│   ├── cache.php
│   ├── compile.php
│   ├── database.php
│   ├── database.php.org
│   ├── filesystems.php
│   ├── mail.php
│   ├── queue.php
│   ├── services.php
│   ├── session.php
│   └── view.php
├── database
│   ├── factories
│   │   └── ModelFactory.php
│   ├── migrations
│   │   ├── 2014_10_12_000000_create_users_table.php
│   │   ├── 2014_10_12_100000_create_password_resets_table.php
│   └── seeds
│       └── DatabaseSeeder.php
├── gulpfile.js
├── package.json
├── phpspec.yml
├── phpunit.xml
├── public
│   ├── favicon.ico
│   ├── index.php
│   └── robots.txt
├── readme.md
├── resources
│   ├── assets
│   │   └── sass
│   │       └── app.scss
│   ├── lang
│   │   └── en
│   │       ├── auth.php
│   │       ├── pagination.php
│   │       ├── passwords.php
│   │       └── validation.php
│   └── views
│       ├── errors
│       │   └── 503.blade.php
│       ├── vendor
│       └── welcome.blade.php
├── server.php
├── storage
│   ├── app
│   ├── framework
│   │   ├── cache
│   │   ├── sessions
│   │   └── views
│   └── logs
│       └── laravel.log
├── tests
│   ├── ExampleTest.php
│   └── TestCase.php
└── vendor
　　　…
```

「/」でアクセスしてどのモジュールが呼ばれているのかが気になると思います。
上のtreeで見ると「/Http」があります。
ここがクライアントのリクエスト(Http)に関わる場所です。
ここの「**route.php**」にURLマッピングが記載されてます。

```
※Blog/app/Http/routes.php
     1	<?php
     2	
     3	Route::get('/', function() {
     4	    return view('welcome');
     5	});
```

こんな感じです。
見たまま直感で読めるとも思いますが、「/でアクセスしたら、**view('welcome')**を返却する」となってます。

つまり、今回は<font color="red">**Controllerを介さずに、viewを返却**</font>しています。
LaravelのViewは「/(PJのルート)直下のresources下」にあります。

```
resources
├── assets
│   └── sass
│       └── app.scss
├── lang
│   └── en
│       ├── auth.php
│       ├── pagination.php
│       ├── passwords.php
│       └── validation.php
└── views
    ├── errors
    │   └── 503.blade.php
    ├── foo.blade.php
    ├── vendor
    └── welcome.blade.php
```

viewsの下のwelcome.blade.phpが「/」で呼ばれてます。
※bladeは後述します。

## routingの追加

では次は「/hello」で呼ばれるroutingを追加してみましょう。
routes.phpに以下を追記してください。

```
     ※Blog/app/Http/routes.php
     1	<?php
     2	
     3	Route::get('/', function() {
     4	    return view('welcome');
     5	});
     6	
     7	Route::get('/hello', function() {
     8	    return 'HelloWorld!';
     9	});
```

追記したのち、ブラウザから「[http://localhost:8000/hello](http://localhost:8000/hello)」にアクセスすると

![スクリーンショット 2015-10-11 22.44.00.png](https://qiita-image-store.s3.amazonaws.com/0/78857/48908a1f-a892-49a6-1ba4-5435c3be2d1b.png)

と<font color="red">テキストのみが表示される</font>のがわかる。
このように、単純にtextを返却することも可能。

## Controllerの追加

routes.phpに以下を追記

```
     1	<?php
     2	
     3	Route::get('/', function() {
     4	    return view('welcome');
     5	});
     6	
     7	Route::get('/hello', function() {
     8	    return 'HelloWorld!';
     9	});
    10	
    11	Route::get('/foo/{name}', 'Lists\FooController@index');
    12	Route::get('/foo', 'Lists\FooController@index');
```

11行目と12行目が新規に追加したrouting設定。
11行目は「/foo/taro」でアクセスした場合、「Lists下のFooCOntrollerのindexAction」が呼ばれ、パラメータとして{name}が$nameとして渡される挙動を取ります。
１２行目は「/foo」でアクセスした場合に、「FooControllerのindexActionをコールする」記述となります。

ではFooControllerを作って、画面が表示されるようにしましょう。
PJのルートに戻って、以下のコマンドを実行。

```
php artisan make:controller Lists/FooController 
```

すると「app/Http/Controller」下のLists下に「FooController」が作成される。
中身は以下のようになっている。

```
<?php

namespace App\Http\Controllers\Lists;

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

class FooController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}
```


こんな感じでたくさんのメソッドを持ったControllerが自動で生成される。
LaravelもRestFul設計に則っているため、delete系はHttpのdeleteメソッドを。
insertやuodateはupdateやpatchに紐付いて呼ばれる設計となっており、
そのための一般的なメソッドをデフォルトで自動で作成してくれる。
ただ、今回はindexAction以外は不要なので、以下にしてしまいましょう。

```
     1	<?php
     2	namespace App\Http\Controllers\Lists;
     3	
     4	use Illuminate\Http\Request;
     5	use App\Http\Requests;
     6	use App\Http\Controllers\Controller;
     7	
     8	class FooController extends Controller
     9	{
    10	    public function index($name = 'hoge')
    11	    {
    12	        return view('foo', ['name' => $name]);
    13	    }
    14	}
```

indexが呼ばれる際に、＄nameを受け取り、値が空ならデフォルト値のhogeという文字列を与えている。
それをviewの「foo」に連携し、viewを表示する際に、値としてnameキーに＄nameの値を渡している。

なので、Viewとしてfooを作成しなければいけない。

## viewの作成

viewはresources/views下になるので、ここに「foo.blade.php」を作成し、
以下を記載する。

```
※ resources/views/foo.blade.php
     1	<!DOCTYPE html>
     2	<html>
     3	    <head>
     4	        <title>test</title>
     5	    </head>
     6	    <body>
     7	        <div class="container">
     8	            <div class="content">
     9	                <div class="title">Foo!!{{$name}}</div>
    10	            </div>
    11	        </div>
    12	    </body>
    13	</html>
```

これで[http://localhost:8000/foo/taro](http://localhost:8000/foo/taro)にアクセスすると、**「Foo!!taro」**が表示されますね。

![スクリーンショット 2015-10-11 23.03.47.png](https://qiita-image-store.s3.amazonaws.com/0/78857/7821f77e-23ba-e883-2d22-b6e097d150a8.png)

## ControllerからViewに値を渡す方法

方法は2通りあるのかな。

1. 配列で渡す
2. compact関数を使う

先ほどの例は前者でした。

```
return view('foo', ['name' => $name]);
```

ですね。こrは

```
$datas = ['name' => $name];
return view('foo', $datas);
```

と同じです。

次がcompact関数の例です。

```
$name = "taro";
return view('foo', compact('name'));
```

viewでのアクセスは変わりありません。
bladeを使うならこう。

```
{{$name}}
```

phpのままなら

```
<?php echo $name; ?>
```


以上です。