phpフレームワークLaravelって何？環境構築の前にちょっと待った！使用用途を徹底解説！！

#絶対に読んで欲しい導入
HTML,PHPを学び、これからLaravelを使おうと思ったそこのエンジニアの皆さん、とりあえず環境構築してコードをググったらある程度使えるようになるだろうと思ってますよね。
確かにその通りです。

しかし実際に使用する前に便利な機能を把握し、Laravelではこんなことができるのかと知っておくことで格段に開発効率が上がります。

座学はエンジニアの皆さんにとってはそんなに面白いものではないかもしれませんが、こんな機能があるならこういうアプリが作れそうだ！などと言った想像を膨らませながら、楽しみながら読んでみてください!!

#そもそもLaravelって何？
![column_main13814.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1525561/03a7d479-db73-7e62-9e10-32f1cca8a72d.png)

Laravelとは、**PHPのフレームワークの1つ**です。

>※ **PHP**とは、Webページを動的に生成できるサーバーサイドのスクリプト言語です。

>※ **フレームワーク**とは、アプリケーションを開発するとき、その土台として機能させるソフトウェアのこと。「アプリケーションフレームワーク」とも呼ばれる。「枠組み」「骨組み」「構造」などといった意味があり、土台となるフレームワークに必要な機能を追加し、アプリケーションの開発を進めていくのが一般的です。

##使用用途や特徴
###MVCモデルで製作を簡単に進めよう！
多機能な**MVCフレームワーク**Model(データ処理)、View(画面表示)、Controller(全体の制御)でフロントエンドからバックエンドまで全てをこれ1つで網羅でき、デフォルトでサーバーサイドに必要なファイルが入っているから面倒な構築を省いて、webアプリをすぐに作成することができる！
####View
LaravelではBlade(拡張子：.blade.php)というHTML形式のテンプレートエンジンを使ってUIを作成します。

**1.共通レイアウトを作成する**
各ページで同じUIを使用する場合に他ファイルで呼びだして使用する共通パーツを作成します。
ページごとに変更したい部分には**@yield('content')**と書く。

```html:resources/views/master.blade.php
<!DOCTYPE HTML>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Site Title</title>
</head>
<body>
  @yield('content')
</body>
</html>
```

**2.共通レイアウトを利用してビュー画面を作成**
@extend('共通レイアウトのファイル名')で共通レイアウトを読み込みます。
ここでは`@extends('master')`です。

共通レイアウトで@yieldした部分にページ別のコンテンツを流し込みます。
`@section('content')`と`@endsection`の間にHTMLを記述します。

```html:resources/views/pages(任意フォルダ名)/sample.blade.php(任意名)
@extends('master')
 
@section('content')
  <h1>sampleページ</h1>
  <p>これは共通レイアウトをつかったsampleページです。</p>
@endsection
```

####Model
Modelでは各種webアプリで使うデータベース（以下DBという）の構造を簡単に作成したり、作成したDBを操作、アクセスして利用するためのものです。

※今回は実用的な、コマンドを使ったモデルの作成からテーブルに値を入れるまでを解説します。専門用語の説明は下記に記載してますので、先にそちらを見て頂いてもOKです。


**1.artisan（アルティザン）コマンドでモデルを作成**
Laravelのフォルダ直下に移動してコマンドラインで下記コマンドを打ちます。
`php artisan make:model Product`
上記コマンドを実行すると下記のProductというモデルがAppフォルダに作成されます。

```php:app/Product.php
namespace App;
 
use Illuminate\Database\Eloquent\Model;
 
class Product extends Model
{
  //
}
```
Productモデルが操作できるテーブル名はproductsと自動的に決められます。
モデル名が小文字複数形になったものがテーブル名として使用される形です。

**2.テーブルの作成**
Laravelではマイグレーション機能を使うことでテーブルの作成を行います。

2_1.マイグレーションファイルの作成
artisanコマンドでテーブル名を指定し、マイグレーションファイルを作成します。
`php artisan make:migration create_product_table --create=products`

2_2.マイグレーションファイルの編集
2_1で作成されたマイグレーションファイルのup()関数の部分に追加したいカラムを記述します。

```php:database/migrations/20xx_xx_xx_xxxxx(日付が自動的に入る)_create_products_table.php
  public function up()
  {
  Schema::create('products', function(Blueprint $table)
  {
  $table->increments('id');//自動でidが付与される
  $table->string('product_name'); // 追加
  $table->integer('price'); // 追加
  $table->timestamps();//作成した時間が入る
  });
  }
```

2_3.マイグレーションファイルの実行
コマンドプロンプトにArtisanコマンドを打ってマイグレーションファイルの実行をします。
`php artisan migrate`
これでproductsテーブルが作成されます。

**3.デフォルトレコードをDBに入れ込むためのシードを作成**

3_1.コマンドでシーダーファイルを作成
`php artisan make:seeder productTableSeeder`

3_2.シーダーファイルの編集
試しに3つのデフォルトレコードを入れ込んでみましょう

```php:database/seeds/productTableSeeder.php
<?php

use Illuminate\Database\Seeder;

class productTableSeeder extends Seeder
{
    public function run()
    {
        $param = [
            'product_name' => 'MacbookPro',
            'price' => 300000,
        ];
        DB::table('products')->insert($param);

        $param = [
            'product_name' => 'Applewatch',
            'price' => 60000,
        ];
        DB::table('products')->insert($param);

        $param = [
            'product_name' => 'Airpods',
            'price' => 20000,
        ];
        DB::table('products')->insert($param);
    }
}
```

3_3.シードの実行
`php artisan db::seed`
これでseederファイルのrun()が実行され、productsテーブルにデフォルトレコードが追加されます。

####Controller
ControllerはModelとViewをつなげる役割を果たします。
具体例を挙げるなら、modelからDBにアクセスし、取得したデータを加工してviewに渡したり、逆にviewから受け取ったデータをmodelに渡して、DBに保存します。

※今回はViewのファイルをコントローラーで呼び出してルート情報をつけるsampleを作成します。

**1.Controllerファイルを作成**
artisanコマンドでControllerファイルを作成します。
`php artisan make:controller SampleController`

**2.メソッドを追加する**
メソッドを作成して、Viewファイルを呼び出します。

```php:app\Http\Controllers\SampleController.php
class SampleController extends controller
{
  public function getIndex()
  {
    return view('sample');//Viewのbladeファイルを呼び出す。
  }
}
```
これで、Viewファイルの呼び出しが完了しましたが、まだ必要な作業があります。

**3.web.phpにルート情報を記述する**
ページを表示させるためにルート情報(URLになるもの)をweb.phpに記載します。

```php:routes\web.php
Route::get('/sample','SampleController@getIndex');
```
これで、localhost:8080でLaravelを起動した場合、localhost:8080/sampleで指定したviewファイルが表示されることになります。

MVCモデルはこのようにModel,View,Controllerを軸に作成していきます。

###パッケージツール composerでライブラリを便利に管理！
![Screen-Shot-2020-06-06-at-17.29.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1525561/bf2177a4-5710-9a34-e56c-8f1ddd77bd1b.png)

**composerとは、PHPのライブラリ管理ツールです。**

ライブラリというのは、ライブラリ1を使いたい！！と思うとそれを使うためには、ライブラリ2.3の2つのライブラリもダウンロードしないといけないなどという依存関係が存在します。
そんな依存関係を管理してくれているので、`composer require 1`と打つだけでライブラリ1に必要な別ライブラリも全てダウンロードしてくれるというまるでライブラリの作曲家のような仕事をしてくれるのです。

###Eloquent ORMとMigrationでwebアプリに必須なDBを管理!

![laravel_eloquent-1280x720.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1525561/7d9f5b64-1dbe-01a7-8fbb-4303831486ae.jpeg)
LaravelではDB上のデータ操作を簡単に行うための**Eloquent ORM**という仕組みが備わっています。
Eloquent ORMはデータベースとモデルに関係性(リレーション)を持たせて、データを柔軟に扱えるようにしたものです。データベースの操作のためのSQLをかなり書きやすくした記述法です。

例えば、SQLでは`select * from user where id = 1;`という記述方法ですが、
Laravelでは,`$data = User::where('id',1)->get();`という書き方になります。
SQLのような長ったらしい文章が短くなり、一致した条件の先頭の値だけを取得することや副問合せなどもわかりやすく書くことができる優れものなのです。

また、**migration**というテーブル定義の仕組みがあり、DBの改変記録を保持しており、SQLを書かなくても、laravel上でテーブルのカラム名や値を作成することができます。共同開発の場合などでも同じテーブルをデフォルトで入れ込むことができる点もメリットです。

#最後に
Laravelは今や世界でもかなりの人気を誇るフレームワークとなっているので独学にも、これから企業に導入しよう！と思っている方はすごくいい判断だと思います。

環境構築をやって、いますぐアプリを作りたくなったことでしょう。これからも良きLaravelライフを！！