初めてのフレームワーク-Laravel5-1基本用語整理

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

##Laravel勉強しようと思ったきっかけ
 * 業務でPHPフレームワークを導入するよう言われた
 * 今までレガシーPHPと呼ばれるようなソースしか触ったことないので、新しいことを知りたかった。
 * Laravelが人気あるとのことで、最新版のLaravel5を勉強してはとアドバイスもらった。

##Laravelって？
>Laravel は、**MVC**のWebアプリケーション開発用の無料・オープンソースのPHPで書かれたWebアプリケーション**フレームワーク**である。(wikipediaより引用)  

###フレームワークとは？
>システム構築に必須な標準的かつ低レベルの詳細を設計者やプログラマが検討する時間を省き、要求仕様の実現に多くの時間を割けるようにし、ソフトウェア開発を容易にするためのツール(wikipediaより引用)  

####メリット
 * セキュリティホールを防ぎやすい
 * 他人が作った機能を利用できる
 * ルールや実装方法を均一化するので、多人数の開発でも混乱しにくい、バグが出にくい
 * 慣れたらすごく早くWEBアプリケーションが作れる
 * プログラム設計の考え方や、MVCモデル、プログラムの書き方等勉強になる

####デメリット
 * フレームワークを覚えるのに時間がかかる
 * 純粋なPHPより実行速度が遅い。（キャッシュの管理とかDB接続回数の減少とか工夫が必要とのこと）
 * 提供されたもの以上の機能追加が大変とのこと

###MVCモデルとは？
M:モデル(model)　V:ビュー(view) C:コントローラー(controller)
http://hijiriworld.com/web/mvc-concept/  この漫画が分かりやすかったです。
表示側、DBアクセス、プログラムによる処理を分けることで、分業できるし、修正する場所が分かりやすいということ？
ただ、DBから取得したデータの整形はどこでやるのか（これはビジネスロジックと呼ばれるらしい）とかは、いろいろあってわからない。
とりあえず、http://kray.jp/blog/think_about_mvc/  このサイトを参考にさせていただき、下のように考えます。(Laravelではどうやってるも今後勉強する。)
>####Model
 * 手続き全部(ビジネスロジック)
 * データ操作
 * 状態管理
 * 変化をView/Controllerに通知

>####View
 * 表示の更新
 * ユーザー入力をControllerに伝搬

>####Controller
 * ユーザー入力の受付
 * Modelに手続きを指示
 * アラートや選択ダイアログの表示
 * 他画面への遷移

##Laravel5を勉強してて出てきたキーワード
### Composer
ライブラリ（汎用性の高いプログラムを、ひとまとまりにしたもの）の依存関係を管理してくれるツール。便利！
Composerを使うとLaravel5の開発に必要なライブラリを一括でインストールできるし、他のライブラリも簡単にインストール出来る。

### Artisan
Laravelを構成しているコマンドラインインターフェイス。
MacのターミナルとかWindowsのコマンドプロンプトみたいなもの。
$ php artisan make:controller hogeController (コントローラー作成)
$ php artisan serve(ビルトインサーバ起動)
って感じで、黒い画面に打ち込んで使います。これも便利！

### Scaffolding
「足場」という意味で、データベースの基本操作（登録、参照、更新など）に必要な機能が備わったプログラムを自動生成する機能
Laravel5では、laravel-api-generatorをComposerでインストールして使えるとのこと。便利そう。

### env
Laravel5では.envというファイルに環境変数を記載します。（DBのパスワードとか)
※この.envはバージョン管理して、githubで見れるようにするとパスワードばれちゃうので、.env.exampleというファイルを.envの代わりにバージョン管理するようです。

### Autoloader
http://blog.comnect.jp.net/blog/122
PHPのファイルはクラス毎に分けることが多いが、必要なクラスを使うたびにrequire_onceでPHPファイルを読み込む必要がある。
しかし、Autoloaderという機能を使うと、require_onceを省略できる。
Autoloaderという機能を使うために、Laravel5ではPSR-4で記述されている。
\vendor\composer\autoload_psr4.php参照

### PSR-0~4
PHPの規約
目的：プログラムの書き方のルールを決めて、そのルールに沿ってフレームワークを作ることで、フレームワークを組み合わせて使えるようにする。
http://blog.tojiru.net/article/356923949.html  を参考にして、以下記述
#### PSR-0
注意:現在はPSR-0は非推奨で、PSR-4に推奨とのこと
Autoloaderのためのファイル名とクラス名の規約
 * クラス名は被らないようにする
 * クラス名とファイルパスを合わせる。
 * 名前空間（後で説明）の先頭は、ベンダー(そのクラスが定義されたファイルの置かれている場所？Laravelのベンダーフォルダには、パッケージが入っている)名を持つこと。  
このルールに従うことで、Autoloaderが違うフレームワーク間でも同じ書き方で使える。
#### PSR-1
変な作り方をするなと言ってる。

 * PHPコードは「<?php」及び 「<?=」タグを使用
 * 文字コードはUTF-8（BOM無し）
 * クラス、関数、定数の定義ファイルと、メール送信とかの処理ファイルは分ける
 * クラス名は、StudlyCaps（単語の先頭文字を大文字で表記）記法で定義する。
 * クラス定数は全て大文字とし、区切り文字にはアンダースコアを用いて定義する。
 * メソッド名はcamelCase記法(先頭の単語のみ小文字、以降の単語の先頭は大文字で表記)で定義する。
 * 名前空間を必ず使うこと。

####PSR-2
コーディングスタイルガイド。
https://github.com/maosanhioro/fig-standards/blob/master/translation/PSR-2-coding-style-guide.md  より

```
<?php
namespace Vendor\Package;

use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

class Foo extends Bar implements FooInterface
{
    public function sampleFunction($a, $b = null)
    {
        if ($a === $b) {
            bar();
        } elseif ($a > $b) {
            $foo->bar($arg1);
        } else {
            BazClass::bar($arg2, $arg3);
        }
    }

    final public static function bar()
    {
        // メソッド本文
    }
}
```

という感じで書くようにというルール。

####PSR-3
ロガー（ログを収集するファイル）は、Psr/Log/LoggerInterfaceを実装したクラスにすると書いてある。
目的：ログが重要＝ログの作り方を共通にして、フレームワークを組み合わせてもうまくログが取れるようにしたい。
**ログの重要性**
不具合起きた時にエラーログがあると、だれが犯人かがわかる！＝原因解明や修正が楽＝ログの設計はすごく大事。だからPSR規約に加えられた。
ビジネスへの展開のためのアクセスログ分析も大事。

####PSR-4
まだ理解がつたない。あとで追記。LaravelのオートローダーはPSR-4を使って書かれていたので、とても大事。

###namespace(名前空間)
変数名やメソッド名、クラス名が使用している複数のライブラリ等でぶつかるかもしれないため、それを避けるために使われる。
例えば、普段フォルダ内にファイルを作成するとき、foo.txtファイルを/home/text/の中に２つ作ることは出来ない。しかし、/home/text/に１つ作って、/home/text2/に１つ作ることは可能。このように違うフォルダ内に入れれば、同名ファイルを作ることができる感じと一緒。
http://ucwd.jp/blog/736  より

```
<?php
namespace MySampleSpace01 {
	function sample_function () {
		/* ... */
	}
}

namespace MySampleSpace02 {
	function sample_function () {
		/* ... */
	}
}
?>
```

って感じでnamespaceを定義することで同名の関数を書ける。
※複数の名前空間をひとつのファイルに記述するようなコーディングは避けるべき。


##記事一覧
[初めてのフレームワーク-Laravel5-1 基本用語整理](http://qiita.com/k-okada/items/65332803aa79745e8f69)
[初めてのフレームワーク-Laravel5-2 構造、基礎メモ](http://qiita.com/k-okada/items/c92a3f3594d751d42740)
[初めてのフレームワーク-Laravel5-3 DB周り用語整理](http://qiita.com/k-okada/items/4dae1d5b25db8a7f3072)
[初めてのフレームワーク-Laravel5-4 エラー時の対策メモ](http://qiita.com/k-okada/items/0fa94f076d08584ee314)
[初めてのフレームワーク-Laravel5-5 DBアクセスメモ](http://qiita.com/k-okada/items/13a3814987fbecc9ae25)
[初めてのフレームワーク-Laravel5-6 Laravel開発環境まとめ](http://qiita.com/k-okada/items/2b8d6db9b96abcb94696)
[初めてのフレームワーク-Laravel5-7 テスト関連メモ](http://qiita.com/k-okada/items/573731d9253252ab88c1)

##その他参考サイト
[laravel5がリリースされたので解説サイト作った](http://site.oganity.pw/%E6%8A%80%E8%A1%93%E3%83%8D%E3%82%BF/laravel5%E3%81%8C%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%95%E3%82%8C%E3%81%9F%E3%81%AE%E3%81%A7%E8%A7%A3%E8%AA%AC%E3%82%B5%E3%82%A4%E3%83%88%E4%BD%9C%E3%81%A3%E3%81%9F/)
[ララ帳](https://laravel10.wordpress.com/)
[ララベル日本語ドキュメント](http://readouble.com/laravel/5/1/ja/)