#Laravel & Markdown記法の勉強及びメモとして書いています。
間違えている点ございましたら、ご指摘いただけますと大変ありがたいです。よろしくお願いいたします。
##構造の基礎
Laravel日本語ドキュメントに沿って記述しています。
###依存性の注入###
※Laravelドキュメントにはないですが、この用語がいたるところに出てくるのでメモします。
DIを利用したプログラムを作成する場合、コンポーネント間の関係はインタフェースを用いて記述し、具体的なコンポーネントを指定しない。具体的にどのコンポーネントを利用するかは別のコンポーネントや外部ファイル等を利用することで、コンポーネント間の依存関係を薄くすることができる。
依存関係がプログラムから外部に取り除かれることで、以下のようなメリットが発生する。
- 結合度の低下によるコンポーネント化の促進
- 単体テストの効率化
- 特定のフレームワークへの依存度低下
(wikiより引用)
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に沿って実装すれば中身が何であっても自由に拡張出来ます)
入れ替え自由(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