23
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-09-01

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

##構造の基礎
Laravel日本語ドキュメントに沿って記述しています。

###依存性の注入###
※Laravelドキュメントにはないですが、この用語がいたるところに出てくるのでメモします。

DIを利用したプログラムを作成する場合、コンポーネント間の関係はインタフェースを用いて記述し、具体的なコンポーネントを指定しない。具体的にどのコンポーネントを利用するかは別のコンポーネントや外部ファイル等を利用することで、コンポーネント間の依存関係を薄くすることができる。
依存関係がプログラムから外部に取り除かれることで、以下のようなメリットが発生する。

  • 結合度の低下によるコンポーネント化の促進
  • 単体テストの効率化
  • 特定のフレームワークへの依存度低下

(wikiより引用)

依存性注入(DI)の解説とやり方

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

Service Container(サービスコンテナ)

※DIコンテナやIoCコンテナとも呼ぶ
Laravel5 - もっと強力的なIoC (4th)
まず上の記事を読んで、IoCの必要性を学ぼう!

ララ帳-サービスコンテナとは-
クラス間の依存性を管理する為の仕組み
サービスコンテナにクラスを紐づけて、サービスコンテナからインスタンスを取得する(インスタンス生成に処理ソース内でのnewを使わない)ことで、

  • クラスの生成を1箇所に集約できる
  • クラスの構造を隠蔽できる
  • モックを使ってテストがしやすくなる

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

Service Provider(サービスプロバイダー)

ララ帳-サービスプロバイダとは-
サービスコンテナへのクラス登録する機能。
遅延ロード(必要になるまでロードを遅らせ、必要なければロードしない)という機能や、起動時あるプログラムを実行する機能などが使える。

Facade(ファザード)

簡単にサービスコンテナに設定されたクラスを使える機能
ララ帳-ファザードとは-
Facade(サービスコンテナ)のメリット

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

ファザードのクラス一覧
全部読む予定。

Contracts(契約) = インターフェイス

日本語ドキュメント-契約-
Interfaceを使おう

interfaceを使う事によって、より安全な拡張性、
(interfaceに沿って実装すれば中身が何であっても自由に拡張出来ます)
入れ替え自由(dependency injection)、など利点が沢山有ります。

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

Lifecycle(リクエストのライフサイクル)

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

アプリケーション構造

日本語ドキュメント-アプリケーション構造
一読すれば問題ないと思う。
こちらの記事のほうが分かりやすいかも。
Laravel5 - ファイル構造(2nd)

##基礎

Routing

ララ帳-LARAVEL 5.1のルーティング-
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-

Middleware

ララ帳-MIDDLEWARE-
日本語ドキュメント-ミドルウェア-
顧客情報はログインしてないと見られないといった機能(会員登録機能)等がつくれる機能。(Laravel4の時はフィルターという機能だったらしい)

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

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

のチュートリアル。

Controller

ララ帳-コントローラーの作成-
日本語ドキュメント-コントローラー-
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

日本語ドキュメント-リクエスト-
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レスポンス-
ドキュメント見ればだいたいわかるので省略

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

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

// ファイルダウンロードレスポンスの生成
return response()->download($pathToFile);

等便利そう。

View

ララ帳-ビューへ値を渡す-

//こんな感じで、表示する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でレイアウトを作る-

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

##今回の参考サイト
ララ帳
ララベル日本語マニュアル
Laravel5.Tutorial

23
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?