初めてのフレームワーク-Laravel5-2 構造、基礎メモ

#Laravel & Markdown記法の勉強及びメモとして書いています。
間違えている点ございましたら、ご指摘いただけますと大変ありがたいです。よろしくお願いいたします。

##構造の基礎
[Laravel日本語ドキュメント](http://readouble.com/laravel/5/1/ja/)に沿って記述しています。

###**依存性の注入**###
※Laravelドキュメントにはないですが、この用語がいたるところに出てくるのでメモします。
>DIを利用したプログラムを作成する場合、コンポーネント間の関係はインタフェースを用いて記述し、具体的なコンポーネントを指定しない。具体的にどのコンポーネントを利用するかは別のコンポーネントや外部ファイル等を利用することで、コンポーネント間の依存関係を薄くすることができる。
依存関係がプログラムから外部に取り除かれることで、以下のようなメリットが発生する。
>
 - 結合度の低下によるコンポーネント化の促進
>
 - 単体テストの効率化
>
 - 特定のフレームワークへの依存度低下
>(wikiより引用)

[依存性注入(DI)の解説とやり方](http://qiita.com/1000k/items/aef6aed46b0fc34cc15e)

Aクラス内部でBクラスをnewすると、そのnewしたBクラスを変更するだけで、Aクラスの単体テストが上手く回らなくなる可能性がある。
一方、Bクラスのインスタンスを引数とすれば、Aクラス内の挙動はBクラスを変更しても、変わらないでテストは常に上手く回る。(引数の値が変わるだけ)
その時に、Aクラスの引数として必要な関数等を、インターフェースで指定しておき、Bクラスはそれを常に実装するようにしておくと、よりエラーが起きない。
ということ？？
再確認。

### Service Container(サービスコンテナ）
※DIコンテナやIoCコンテナとも呼ぶ
[Laravel5 - もっと強力的なIoC (4th)](http://qiita.com/fluke8259/items/99d019a1a8a9f32508b2#ioc)
まず上の記事を読んで、IoCの必要性を学ぼう！

[ララ帳-サービスコンテナとは-](https://laravel10.wordpress.com/2015/04/14/%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A/)
クラス間の依存性を管理する為の仕組み
サービスコンテナにクラスを紐づけて、サービスコンテナからインスタンスを取得する（インスタンス生成に処理ソース内でのnewを使わない)ことで、
>
 - クラスの生成を１箇所に集約できる
 - クラスの構造を隠蔽できる
 - モックを使ってテストがしやすくなる

>  → 保守性、柔軟性、テスト性が向上


### Service Provider(サービスプロバイダー)
[ララ帳-サービスプロバイダとは-](https://laravel10.wordpress.com/2015/04/22/%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%83%97%E3%83%AD%E3%83%90%E3%82%A4%E3%83%80%E3%83%BC/)
サービスコンテナへのクラス登録する機能。
遅延ロード（必要になるまでロードを遅らせ、必要なければロードしない）という機能や、起動時あるプログラムを実行する機能などが使える。

### Facade(ファザード)
簡単にサービスコンテナに設定されたクラスを使える機能
[ララ帳-ファザードとは-](https://laravel10.wordpress.com/2015/04/27/%E3%83%95%E3%82%A1%E3%82%B5%E3%83%BC%E3%83%89/)
Facade(サービスコンテナ)のメリット

- 短く簡潔なプログラムを書ける
- テストに便利なフレームワークのMockeryと統合されていてテストがしやすい
- サービスコンテナを経由してインスタンスを取得してるので、仕様と実装の分離がしやすい。

[ファザードのクラス一覧](http://readouble.com/laravel/5/1/ja/facades.html#facade-class-reference)
全部読む予定。

### Contracts(契約) = インターフェイス
[日本語ドキュメント-契約-](http://readouble.com/laravel/5/1/ja/contracts.html)
[Interfaceを使おう](http://qiita.com/ytake/items/c201abafb287af2df862)
>interfaceを使う事によって、より安全な拡張性、
(interfaceに沿って実装すれば中身が何であっても自由に拡張出来ます)
入れ替え自由(dependency injection)、など利点が沢山有ります。

ファザードとの違いをまだ理解しきったとは言えないので、使いながら効果を確認。


### Lifecycle(リクエストのライフサイクル)
[日本語ドキュメント-リクエストのライフサイクル-]
(http://readouble.com/laravel/5/1/ja/lifecycle.html)
Laravel5がどのように動いているかを説明している。

### アプリケーション構造
[日本語ドキュメント-アプリケーション構造](http://readouble.com/laravel/5/1/ja/structure.html)
一読すれば問題ないと思う。
こちらの記事のほうが分かりやすいかも。
[Laravel5 - ファイル構造(2nd)](http://qiita.com/fluke8259/items/5f75693ad96a759041de#%E5%A4%A7%E3%81%BE%E3%81%8B%E3%81%AA%E6%A7%8B%E9%80%A0)

##基礎

### Routing
[ララ帳-LARAVEL 5.1のルーティング-](https://laravel10.wordpress.com/2015/04/03/%E6%A7%98%E3%80%85%E3%81%AA%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0/)
URLと定義したControllerや処理を紐付ける。
app/Http/routes.php に下のように記載する。

```
// test.com/welcomeにアクセスしたとき、WelcomeControlleにあるindex関数を動かす。
Route::get('/welcome', 'WelcomeController@index');

// test.com/helloにアクセスしたとき、Hello worldを返す = Hello worldを表示させる
Route::get('/hello', function()
{
    return 'Hello World';
});

```
あと、このRESTFUL CONTROLLERって使い方が便利
[ララ帳-RESTFUL RESOUCE CONTROLLER-](https://laravel10.wordpress.com/2015/03/20/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AElaravel-5-25-restful-resouces/)


### Middleware
[ララ帳-MIDDLEWARE-](https://laravel10.wordpress.com/2015/03/26/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AElaravel-5-30-middleware/)
[日本語ドキュメント-ミドルウェア-](http://readouble.com/laravel/5/1/ja/middleware.html)
顧客情報はログインしてないと見られないといった機能（会員登録機能）等がつくれる機能。(Laravel4の時はフィルターという機能だったらしい）

[Laravel5 - Authentication & Middleware(6th)]
(http://qiita.com/fluke8259/items/70a322fc98e5618b3c6a)

 - 会員登録、ログイン機能の実装
 - Middlewareを使ったRedirect制御の実装

のチュートリアル。



### Controller
[ララ帳-コントローラーの作成-](https://laravel10.wordpress.com/2015/02/17/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AElaravel-5-2-%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/)
[日本語ドキュメント-コントローラー-](http://readouble.com/laravel/5/1/ja/controllers.html)
MVCモデルのC:Controllerで行う処理を書きます。
Laravelの特徴としては、サービスコンテナが全コントローラーの依存解決のために使用されていることです。  
->必要な依存をタイプヒント（関数及びメソッドが受け取る引数がどのオブジェクトなのか(もしくはなんのインターフェースを備えるか)、配列なのか、コールバックなのかなどを指定することが出来る機能)で指定できる。

```
<?php //名前空間の記述、このファイルはAppフォルダ下のHttpフォルダ下のControllersフォルダに属する
namespace App\Http\Controllers;

// Use宣言 Illuminate\Routing\Controller.phpのControllerクラスをControllerという名前で利用可能にする。(クラス名とファイル名が一緒なので省略できる）
use Illuminate\Routing\Controller;
use App\Repositories\UserRepository;

// Use宣言したIlluminate\Routing\Controller.phpのControllerクラスを継承
class UserController extends Controller {

    /**
     * ユーザーリポジトリーインスタンス
     */
    // protected宣言された変数は、そのクラス自身と継承したクラス、親クラスのみからアクセスできる。
    protected $users;

    /**
     *　新しいコントローラーインスタンスの生成
     *
     * @param  UserRepository  $users
     * @return void
     */
    // UserRepositoryオブジェクトを$usersに代入。
    public function __construct(UserRepository $users)
    {
　　　　// コンストラクタインジェクション(依存性の注入をする)
        $this->users = $users;
    }

}
```
という感じで書く。
※Illuminate/Routing/Controller.phpを見てみたくて探しても見つからない。これは、Vendor/composer/autoload_psr4.phpで、Illuminate = vendor/laravel/framework/src/illuminateとされているため。そのため、vendor/laravel/framework/src/illuminate/Routing/Controller.phpを見ればよい。

### Request
[日本語ドキュメント-リクエスト-](http://readouble.com/laravel/5/1/ja/requests.html)
Laravelでは、Requestファザードを使って、現在のリクエスト（POSTとか)へアクセスします。

```
//Formでinput=nameで指定した値を取得
$name = Request::input('name');
//全てのリクエスト（formでinputした値)を取得
$input = Request::all();
```
さらにLaravelは現在のリクエストを次へ持ち越すことができる。

```
//リクエストをセッションでフラッシュデータとして保存
Request::flash();
//フラッシュデータを取得
$username = Request::old('username');
```
Laravelのクッキーは認証プログラムで署名、暗号化されているので、クライアント側で変更不可。

```
//クッキー値の取得
$value = Request::cookie('name');
//クッキーの作成
$response->withCookie(cookie()->forever('name', 'value'));
```

[Laravel5 - Request(5th)]
(http://qiita.com/fluke8259/items/142711dbad89c57ba923)
POSTでもらったForm dataを簡単にValidateする方法の説明。

### Responce
[日本語ドキュメント-HTTPレスポンス-](http://readouble.com/laravel/5/1/ja/responses.html)
ドキュメント見ればだいたいわかるので省略

```
// セッションにデータを保存しながら、新しいURLにリダイレクト
return redirect('user/login')->with('message', 'Login Failed');

//JSONレスポンスの生成
return response()->json(['name' => 'Abigail', 'state' => 'CA']);

// ファイルダウンロードレスポンスの生成
return response()->download($pathToFile);
```
等便利そう。

### View
[ララ帳-ビューへ値を渡す-](https://laravel10.wordpress.com/2015/02/18/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AElaravel-5-4-%E3%83%93%E3%83%A5%E3%83%BC%E3%81%B8%E5%80%A4%E3%82%92%E6%B8%A1%E3%81%99/#more-212)

```
//こんな感じで、表示するviewファイルの名前(greeting)、引数(name = james)を渡します。
Route::get('/', function()
{
    return view('greeting', ['name' => 'James']);
});
```
※ちなみにLaravelでviewを作るときは主にBLADEテンプレートを使います。

### Bladeテンプレート ###
[日本語ドキュメント-Bladeテンプレート-]
(http://readouble.com/laravel/5/1/ja/blade.html)
Bladeの利点は、**テンプレートの継承**と**セクション**

```
<!-- resources/views/layouts/master.blade.phpに保存 -->

<html>
    <head>
        <title>アプリケーション名 - @yield('title')</title>
    </head>
    <body>
        @section('sidebar')
            ここはマスターサイドバー
        @show

        <div class="container">
            @yield('content')
        </div>
    </body>
</html>
```
こうやって定義して、

```
<!-- resources/views/child.blade.phpに保存 -->

@extends('layouts.master')

@section('title', 'Page Title')

@section('sidebar')
    @@parent

    <p>ここはマスターサイドバーに追加される</p>
@endsection

@section('content')
    <p>ここが本文のコンテンツ</p>
@endsection
```
って書く。
下をまねしてみると、分かりやすい。
[ララ帳-BLADEでレイアウトを作る-](https://laravel10.wordpress.com/2015/02/19/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AElaravel-5-5-blade%E3%81%A7%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88%E3%82%92%E4%BD%9C%E3%82%8B/)

長くなってきたので、次へ
次はEloquentについて勉強する！！

##今回の参考サイト
[ララ帳](https://laravel10.wordpress.com/)
[ララベル日本語マニュアル](http://readouble.com/laravel/5/1/ja/)
[Laravel5.Tutorial](http://qiita.com/tags/laravel5.tutorial)