🫠

Laravel 自習ノート

2023/09/29に公開

はじめに

久しぶりにLaravelを使うことになったので記事にまとめながら復習していこうと思います。

Laravelとは

Laravelはwebアプリの作成に使われるフレームワーク。MVCモデル(Model-View-Controller)という構造が採用されていて、機能が最初から分離されているためコードを綺麗に整理できる。Modelはデータ操作担当、ViewはUI担当、Controllerは裏側での処理担当。

準備

1.XAMPP, MAMPのインストール
2.Composerのインストール
3.プロジェクトの作成

XAMPP, MAMPのインストール

XAMPP, MAMPはPHPの開発環境。Windowsの場合はXAMPPを、Macの場合はMAMPをインストールする。インストールが完了したらターミナルで以下のコマンドを実行してphpがインストールされていることを確認してみる。

php -v

バージョンが帰ってきたらOK。

Composerのインストール

Composerはphpのパッケージ管理ツール。公式ページからインストールする。

プロジェクトの作成

プロジェクトを作成するディレクトリで以下のコマンドを実行する。

composer create-project laravel/laravel sample-app

sample-appはプロジェクト名。

プロジェクトが作成できたことを確認して、プロジェクト内で以下のコマンドを実行するとサーバーが起動する。

php artisan serve

http://127.0.0.1:8000/ にアクセスするとスタートページが見られる。

ルーティング

ルーティングとはURLと行う処理を結びつける機能。Laravelではroutes/web.phpを使う。

ルーティングの基本的な書き方

Route::get('URL', 行いたい処理)

getの部分はhttpメソッドによって変わる。プロジェクトを作成した時点でのweb.phpでは"/"というURLにviewのwelcomを返す関数を結びつけている。

Route::get('/', function () {
    return view('welcome');
});

ルーティングを試す

まずはresources/views/hello.blade.phpを作成し、以下を記述する。

<html>
    <head>
        <title>Hello</title>
    </head>
    <body>Hello World!</body>
</html>

次に以下のようにroutes/web.phpを書き換える。

Route::get('/', function () {
    return view('welcome');
});

// 追加
Route::get('/hello', function () {
    return view('hello');
});

http://127.0.0.1:8000/hello にアクセスすると作ったページが表示される。

Controller

Controllerは実際に行いたい処理を書く部分。

Controllerの作成

プロジェクトのルートディレクトリで以下のコマンドを実行してControllerを作成する。

php artisan make:controller HelloController

このコマンドを実行するとapp/Http/Controllersフォルダ内にHelloController.phpが作成される。Controller名は基本UpperCamelCaseで命名する。

Controllerを試す

作成したHelloController.phpを書き換える。

class HelloController extends Controller
{
    // 以下を追加
    public function index() {
        return view('hello');
    }
}

routes/web.phpを書き換える。

use Illuminate\Support\Facades\Route;
// 以下の一行も追加
use App\Http\Controllers\HelloController;

Route::get('/', function () {
    return view('welcome');
});

// 以下を書き換える
Route::get('/hello', [HelloController::class, 'index']);

第二引数には配列で [コントローラー名::class, 'そのコントローラー内の関数'] という形で指定する。http://127.0.0.1:8000/hello にアクセスすると先ほどと同じようにhello.blade.phpが表示されるが、今回はControllerを介して表示している。

View

ViewはUIに関するコードを書く部分。LaravelではViewのコードを書く時にbladeファイルを使う。bladeの拡張子は.blade.phpとなる。

bladeを試す

hello.blade.phpを書き換える。

<html>
    <head>
        <title>Hello</title>
    </head>
    {{-- 以下を書き換える --}}
    <body>Hello {{ $name }}!</body>
</html>

bladeに変数を埋め込む際にはマスタッシュ構文{{ 変数名 }}を使う。

次にHelloController.phpを書き換える。

public function index() {
    return view('hello', ['name' => 'Taro']);
}

ここではview関数の第二引数で連想配列を使って、bladeで用意した'name'という変数に'Taro'という文字列を渡している。

ディレクティブ

ディレクティブとはblade内で条件分岐や繰り返しなどを行う際に使う構文で、@から始める。
試しに変数の有無で表示内容を変えるコードを書く。hello.blade.phpを書き換える。

<html>
    <head>
        <title>Hello</title>
    </head>
    {{-- 以下を書き換える --}}
    <body>
        @isset($name)
        <div>Hello {{ $name }}!</div>
        @else
        <div>Hello World!</div>
        @endisset
    </body>
</html>

$nameという変数に値が渡されている場合と渡されていない場合で別の内容が表示される。変数の存在の他にも色々ある。条件分岐(@if)、回数による繰り返し(@for)、配列などの要素の数だけ繰り返し(@foreach)など。

Model

データを操作するコードを書く部分。データベースのテーブルとModelは一対一で対応している。

データベースの作成

まずは環境変数を編集する。プロジェクトのルートディレクトリの.envファイルを編集する。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=sample
DB_USERNAME=root
DB_PASSWORD=

とりあえず今はデータベースの名前である、DB_DATABASEだけを変更する。その後phpMyAdminで、DB_DATABASEで設定した名前のデータベースを作成する。

テーブルの作成

phpMyAdminからでもテーブルの作成はできるが、チーム開発時など手間をなくすためにLaravelではマイグレーションというものを使う。マイグレーションファイルはテーブルの設計図のようなもの。プロジェクトを作成した時点でいくつかマイグレーションファイルは作られているが、新しくshopsというテーブルを作成するマイグレーションファイルを作ってみる。テーブル名の命名規則は複数形のsnake_case。

まずはマイグレーションファイルを作成する。ターミナルで以下のコマンドを実行する。

php artisan make:migration create_shops_table --create=shops

create_shops_tableがファイル名、--create=shopsがshopsというテーブルを新規作成するマイグレーションファイルを作成する部分である。既存のテーブルの構造を変えたい時は--createではなく--tableを使う。

database/migrationsフォルダに新しく追加されたファイルを編集する。

public function up(): void
    {
        Schema::create('shops', function (Blueprint $table) {
            $table->id();

            // 以下を追加
            $table->string('shop_name');
            $table->string('address');
            $table->string('phone_number');

            $table->timestamps();
        });
    }

マイグレーションファイルを編集する時はupという関数の部分にマイグレート時に実行したいコード、downという関数の部分にロールバック時に実行したいコードを書く。上の例ではマイグレート時にshopsテーブルに"shop_name"、"address"、"phone_number"、というそれぞれ文字列型を格納するカラムを追加するコードを追加した。公式ドキュメントを読むと指定できる型がわかる。

マイグレートしてみる。ターミナルで以下のコマンドを実行する。

php artisan migrate

実行後phpMyAdminでsampleというデータベースを確認するとテーブルが作られている。

Modelを作る

以下のコマンドを実行する。

php artisan make:model Shop

このコマンドを実行するとapp/ModelsにShop.phpが作成される。モデル名の命名規則は単数系のUpperCamelCase。テーブル名、モデル名が命名規則に従っている場合、自動でテーブルとモデルが結びつけられる。

Eloquentについて

EloquentとはModelを介してデータベースの操作ができる機能。データのCRUD(Create, Read, Update, Delete)操作ができる。

createを使ってみる

まずはShop.phpを編集する。モデルに$fillableを追加することでテーブルの中で変更可能なデータを指定する。$fillableの代わりに$guardedを使うこともできる。$guardedを使う時は変更不可能なデータを指定する。

use HasFactory;

// 以下を追加
protected $fillable = [
    'shop_name',
    'address',
    'phone_number',
];

次にHelloControllerを以下のように編集する。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
// 以下を追加
use App\Models\Shop;

class HelloController extends Controller
{
    
    public function index() {
        return view('hello', ['name' => 'Taro']);
    }

    // 以下を追加
    public function create_shop() {
        Shop::create([
            'shop_name' => 'A店',
            'address' => 'A市',
            'phone_number' => '0000-00-0000',
        ]);
	
        return redirect('/');
    }
}

ルーティングを追加する。route/web.phpに以下を追加する。

Route::get('/create-shop', [HelloController::class, 'create_shop']);

http://127.0.0.1:8000/create-shop にアクセスするとデータが追加され、http://127.0.0.1:8000/ にリダイレクトされる。

whereを使ってみる

whereはテーブルから特定のデータを取得するためのメソッド。
HelloControllerを以下のメソッドを追加する。

public function search_shop() {
    $shop = Shop::where('shop_name', '=', 'A店')->first();
    return view('show_shop', compact('shop'));
}
where('カラム名', '比較演算子', '比較する値')

の形で使う。first()はwhereで検索をして初めに条件を満たしたデータを一つだけ取得する。条件を満たしたデータ全てを取得する場合はfirst()ではなくget()を使う。
compact()はviewに変数を渡す関数。

次にviewを用意する。resources/views/show_shop.blade.phpを作成し、以下のように編集する。

<html>
  <head>
    <title>show shop</title>
  </head>
  <body>
    {{ $shop }}
  </body>
</html>

編集したコントローラーに合ったルーティングを用意し、用意したurlにアクセスするとwhereで取得したデータが表示される。

Discussion