🍣

Laravel入門

2024/02/20に公開

イントロダクション

アルバイト先の社内勉強会のメモ書きです.

laravelとは

  • PHPのフレームワーク
  • 開発を行う際に必要となる機能や、基本的な骨組みをまとめたもの
  • 効率的な開発が可能

Laravelの特徴

MVCアーキテクチャ

  • LaravelではMVCアーキテクチャを採用している
  • MVCとはデータベースとの接続を行うModel(モデル)、ブラウザへの表示を行うView(ビュー)、指令や指示を司るController(コントローラ)の3つの機能を分けて開発することをいう
  • それぞれのコードは独立しており,コードを修正した場合でも全体に及ぼす影響が少ない
  • それゆえ分業もしやすい
    MVCアーキテクチャ

テンプレートエンジン

  • Bladeファイルを利用することで,HTML内で変数やプログラミングの構文(forやif)を利用することができる
  • reactのコンポーネントに近い
<div>
    @if (Route::has('login'))
        <div>
            @auth
                <a href="{{ url('/profile') }}">{{ $name }}</a>
            @else
                <a href="{{ route('login') }}">Log in</a>

                @if (Route::has('register'))
                    <a href="{{ route('register') }}">Register</a>
                @endif
            @endauth
        </div>
    @endif

Eloquent ORM

  • データベース操作を直感的に行えるようにするための機能
  • pythonのSQLAlchemy,node.jsのPrismaのようなもの
$user = User::where('email', 'example@example.com')->first();

User::create([
    'name' => 'Jane Doe',
    'email' => 'jane@example.com',
    'password' => bcrypt('password'),
]);

Auth機能

ログイン認証などの機能もあらかじめ存在する

パッケージ管理

Composerと言うパッケージ管理ツールを利用している.
開発に必要ないろいろな機能を利用,管理することができる.
node.jsのnpmのようなもの

機能の説明

ビュー

Web画面の表示の部分
次に紹介するコントローラから変数を受け取り表示を行う.
forやifなどのプログラミング構文が利用できる.
拡張子は.blade.php

コントローラ

入力の処理やデータベース操作などバックエンドの部分を担当している
データを変数に格納し適切なビューを返す

ルーティング

URLを適切なコントローラや処理に割り当てる機能

Route::get('/articles', [ArticleController::class, 'index']);
Route::post('/articles', [ArticleController::class, 'store']);
Route::get('/articles/{article}', [ArticleController::class, 'show']);

モデル

テーブルごとのORM
CRUD(Create, Read, Update, Delete)操作を簡単に実装できる

マイグレーション

データベースのバージョン管理
データベーススキーマを定義および共有できる
テーブルの作成や修正などをファイルで管理している
php artisan make:migration create_{テーブル名}_tableでマイグレーションファイルを作成

User.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('users');
    }
};

テーブル構造を定義して...
php artisan migrateでテーブル作成!

シーディング

コードで初期データを定義する
php artisan make:seeder UserSeederでシーダーファイルを作成

UserSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class UserSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        DB::table('users')->insert([
            'name' => 'Zun Teku',
            'email' => 'teku.zun@horizon-cg.com',
            'password' => 'password',
        ]);
    }
}

初期データを定義して...
php artisan db:seedでデータ挿入完了!

実践

インストール

Laravel9からdockerでの環境構築が推奨されていて,docker環境を操作するためのCLI(sail)が提供されている.
これでdocker環境を利用しながらdockerを意識せずローカルから開発を行える.
すごい!

今回はlaravelとmysqlのみインストールする

curl -s "https://laravel.build/project-name?php=82&with=mysql" | bash
echo "alias sail='[ -f sail ] && sh sail || sh vendor/bin/sail'" >> ~/.zshrc

>>>にすると~/.zshrcを全部上書きしてしまうので注意😭

source ~/.zshrc
cd project-name && sail up -d

ブラウザでlocalhostを確認
動かない時

  • port確認
    • 多分.envで設定する
  • sail artisan key:generateをしてみる

コントローラ作成

コマンドでコントローラを作成

sail artisan make:controller HelloController

ファイルを以下のように変更する.

app/Http/Controllers/HelloController.php
 <?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
-    //
+    public function show()
+    {
+        $name = 'Zun Teku';
+        return view('hello', ['name' => $name]);
+    }
}

ルーティング

ファイルを以下のように変更する.

routes/web.php
 <?php

use Illuminate\Support\Facades\Route;
+ use App\Http\Controllers\HelloController;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "web" middleware group. Make something great!
|
*/

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

+ Route::get('/hello', [HelloController::class, 'show']);

ビュー作成

resources/views配下にhello.blade.phpを作成.

resources/views/hello.blade.php
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Laravel</title>
    </head>
    <body>
        <p>hello world!</p>
        <p>my name is {{ $name }}</p>
    </body>
</html>

応用

TodoList作成

  • controllerで変数設定し,viewに渡す
  • viewで変数を表示
  • viewでforなどを利用
  • modelを利用してdbと接続
    などなど

Discussion