Laravel基本内容のまとめ１

#はじめに
LaravelはPHPを代表するWebフレームワークです。Laravelを理解する上でまずこれだけは知っておいた方がいいという内容をまとめてみました。実際の開発では、ここから肉付けして理解を深めていくとよいと思います。
※現場でよく使われているLaravelバージョン6(LTS)で記載しています。最新バージョンの場合は、部分的に異なる箇所もありますので、[公式ドキュメント](https://readouble.com/laravel/)を参照してください。
※続きとなる「Laravel基本内容のまとめ２」は[こちら](https://qiita.com/WorldLab5/items/3f83462c339db62f9295)

#1. 環境構築
###1. XAMPPインストール
XAMPPをインストールすると、apacheやPHP、MariaDBといったWeb開発に必要な環境を、簡単にまとめてインストールすることができます。
XAMPPインストール：https://www.apachefriends.org/jp/index.html

###2. Composerインストール
Composerインストール：https://getcomposer.org/download/

###3. Laravelインストール
```php
composer global require "laravel/installer"
```
###4. プロジェクト作成
```php
# 最新バージョンの場合
composer create-project --prefer-dist プロジェクト名
# バージョン6の場合
composer create-project "laravel/laravel=6.*" --prefer-dist プロジェクト名
```
###5. サーバ起動
apache起動後に、http://localhost/test/public でスタートの画面が表示されることを確認します。(プロジェクト名をtestにした場合)

#2. プロジェクトディレクトリ
* app・・コントローラ、ミドルウェア、リクエスト等のコアとなるクラスが配置される
* bootstrap・・フレームワークの初期処理を行うapp.phpファイルや、フレームワークが生成するルートやサービスのキャッシュファイルが配置される
* config・・アプリケーション全ての設定ファイルがある
* database・・データベースのマイグレーションやモデルファクトリー、シーディングのファイルを配置
* public・・アセットと呼ばれるJS、CSS、画像等を配置
* resources・・ビューやアセットの元となるLESS、SASS、JS等のファイルを配置
* route・・webルートが記載されるweb.phpや、api用ルートのapi.php等がある
* storage・・セッション、ファイルキャッシュ、ログ等が生成される
* tests・・PHPUnitテストのファイルを配置
* vendor・・laravelの核となるパッケージやComposerによる追加パッケージが配置される

#3. 基礎
###ルーティング
全てのWebルートは「routes/web.php」に記載されます。getメソッド、postメソッドの他にputメソッドやdeleteメソッド等も使われます。
指定URLに対応する、viewもしくはコントローラクラスとメソッド名を指定します。
{ }で囲まれた箇所は、コントローラへ任意の値を渡すことができます。{ ?}になると値がなくてもルーティングされます。
groupメソッドを使用すると、第1引数の内容が第2引数のfunction内全てのルートへ適用できます。prefixはプレフィックスと呼ばれ、指定したURLの前につく文字列のことです。

```php
Route::get('/', function () {
  return view('index');
});
Route::get('/user', 'UserController@index');
Route::get('/calc/{num}', 'UserController@calc');
Route::get('/calc2/{num?}', 'UserController@calc'); // numの省略可能
Route::group(['prefix' => 'user', 'namespace' => 'Login', 'middleware' => 'admin'], function () {
  Route::post('/login', 'UserController@login');
  Route::post('/logout', 'UserController@logout');
});
```
###コントローラ
Laravel標準のControllerクラスを継承して作成します。各メソッドは、引数にRequestクラスや、URLから引き継いだデータを使用することができます。

```php
class UserController extends Controller
{
  public function calc(Request $request, $num){
    $num = $num * 10;
    return view('output', ['num' => $num]);
  }
}
```
###リクエスト
Requestクラスを使用して、inputデータの取得やクエリストリングの取得、URLの取得等を行えます。

```php
public function login(Request $request){
  $input = $request->all(); // 全入力データの取得
  $name = $request->input('name');
  $name = $request->input('name', 'Sally'); // 第2引数は、nullの場合に格納される
  $name = $request->query('name');
  $name = $request->query('name', 'Sally'); // 第2引数は、nullの場合に格納される
  $input = $request->only(['username', 'password']); // 指定した入力データのみを取得
  $input = $request->except(['credit_card']); // 指定以外の全ての入力データを取得
  $uri = $request->path(); // リクエストURIの取得
  $url = $request->fullUrl(); // クエリ文字列付きリクエストURLの取得

  return view('output');
}
```
###リダイレクト
グローバルなredirectヘルパを使用して、リダイレクト処理を行うことができます。
また、フォームの内容にエラーがある時等にbackヘルパを使用して、直前のページへリダイレクトすることができます。

```php
public function index(Request $request){
  return redirect('home/dashboard');
}
public function login(Request $request){
  return back()->withInput();
}
```
###ミドルウェア
ミドルウェアとは、リクエストの前もしくは後に実行される処理のことを言います。
ミドルウェアの登録は、「app/Http/Kernel.php」ファイルで行います。
$routeMiddlewareプロパティへの登録は短縮キーで登録し、「route/web.php」ファイルで指定します。

```php:TestMiddleware.php
class TestMiddleware
{
  public function handle($request, Closure $next)
  {
    // リクエスト前アクションを実行

    $response = $next($request);

    // リクエスト後アクションを実行

    return $response;
  }
}
```

```php:Kernel.php
protected $routeMiddleware = [
  'test' => \Illuminate\Auth\Middleware\TestMiddleware::class,
];
```

```php:web.php
Route::get('/user', 'UserController@index')->middleware('test');
```

###セッション
セッションの取得や設定は、Requestクラスから行う方法とグローバルsessionヘルパを使う方法があります。
flashメソッドはリクエスト間だけ持続するセッションの設定を行いたい場合に使い、forgetメソッドでセッションを削除できます。
hasメソッドでセッションにデータが存在するかを確認することができます。

```php
// セッションの取得
$value = $request->session()->get('key');
$value = $request->session()->get('key', 'default'); // 第2引数は、nullの場合に格納される
$value = session('key');
$value = session('key', 'default'); // 第2引数は、nullの場合に格納される

// セッションの設定
$request->session()->put('key', 'value');
session(['key' => 'value']);

$request->session()->flash('status', 'Task was successful!');
$hasUser = $request->session()->has('users')
$request->session()->forget('key');
```
###バリデーション
バリデーションは、FormRequestクラスを継承したRequestクラスを作成し、バリデーションのルールやメッセージを記載します。
作成したRequestクラスをコントローラのメソッドの第1引数へ記載することで、バリデーションチェックが行われます。
チェックが通れば、そのまま処理は続行され、問題があれば前画面へ戻ります。
主なバリデーションの種類は下記のようになっています。パイプ(|)で繋げることでAND条件で適用することができます。

* required・・必須
* max・・最大文字数 or 最大値
* integer・・整数値
* alpha・・アルファベット
* after:日付・・指定日付以降か
* email・・email形式

```php:MesssageRequest.php
class MesssageRequest extends FormRequest
{
  public function rules()
  {
    return [
        'title' => 'required|max:255',
        'body' => 'required',
    ];
  }

  public function attributes()
  {
    return [
      'title' => 'タイトル',
      'body' => '本文',
    ];
  }

  public function messages()
  {
    return [
      'required' => ':attributeは必須入力です',
      'max' => ':attributeは:max文字以下で入力してください',
    ];
  }
}
```

```php:TestController.php
public function message(MesssageRequest $request){
  // バリデーションが通れば処理される
}
```

###エラーページ
abortヘルパを使用すると処理は中断され、指定したHTTPステータスコードが返されます。
「resources/views/errors/404.blade.php」のようにカスタムエラーページを作成することで、abortコール時に表示されるようになります。
abortヘルパが生成するHttpExceptionインスタンスは、$exception変数としてエラーページへ渡されます。

```php:TestController.php
abort(500, 'サーバエラーが起こりました');
```

```php:500.blade.php
{{$exception->getMessage()}}
```

###ログ
ログの出力はLogファサードを使います。
emergency、alert、critical、error、warning、notice、info、debugの8ログレベルが用意されています。
デフォルトでは、「storage/logs/laravel.log」へ出力されます。

```php
use Illuminate\Support\Facades\Log;

class UserController extends Controller
{
  public function index(Request $request, $id){
    Log::info('user: '.$id);
    return view('output');
  }
}
```

以上です。
続き「Laravel基本内容のまとめ２」は[こちら](https://qiita.com/WorldLab5/items/3f83462c339db62f9295)です。