PHP Laravel開発者面接質問2026:完全準備ガイド

2026年のLaravel 13対応。Eloquent ORM、サービスコンテナ、認証パターン、キュー処理、テスト戦略など、Laravelエンジニア面接で問われる重要トピックを網羅的に解説します。

PHP Laravel開発者面接質問2026:完全準備ガイド

PHP Laravel開発者の面接では、フレームワークの知識とソフトウェア設計原則の両方が問われます。2026年3月にリリースされたLaravel 13では、AI SDK、PHP Attributes、Passkey認証が導入されており、面接官は最新機能の理解とコア基礎知識の両方を求めています。

面接の重点分野

Laravel面接では通常、5つの柱がカバーされます:Eloquent ORMのリレーションシップとパフォーマンス、サービスコンテナと依存性注入、認証・認可パターン、キューとジョブ処理、テスト戦略です。シニアポジションでは、アーキテクチャの決定とパッケージエコシステムの知識も加わります。

Eloquent ORMとデータベースに関する質問

EloquentはLaravel面接で最も議論されるトピックです。面接官は、候補者が遅延ロードと即時ロード、リレーションシップの種類、クエリ最適化を理解しているかを評価します。

Q: N+1問題とは何ですか?Laravelはどのように解決しますか?

N+1問題は、コードがコレクションを取得するために1つのクエリを実行し、その後、各アイテムの関連データをロードするためにN個の追加クエリを実行する場合に発生します。Laravelはwith()による即時ロードでこれを解決します。

app/Http/Controllers/PostController.phpphp
// N+1問題: 投稿用に1クエリ + 著者用にNクエリ
$posts = Post::all();
foreach ($posts as $post) {
    echo $post->author->name; // 投稿ごとにクエリが発生
}

// 解決策: with()で即時ロード
$posts = Post::with('author')->get(); // 合計2クエリ
foreach ($posts as $post) {
    echo $post->author->name; // 追加クエリなし
}

Laravel 13では開発環境でストリクトモードが維持されており、遅延ロードが発生すると例外がスローされ、N+1問題を早期に発見できます。

Q: hasOnehasManybelongsTobelongsToManyの違いを説明してください。

リレーションシップ外部キーの位置
hasOne関連モデル上User hasOne Profile (profiles.user_id)
hasMany関連モデル上User hasMany Posts (posts.user_id)
belongsTo現在のモデル上Post belongsTo User (posts.user_id)
belongsToManyピボットテーブルUser belongsToMany Roles (role_user テーブル)

Q: ソフトデリートの処理方法とその影響について説明してください。

app/Models/Post.phpphp
use Illuminate\Database\Eloquent\SoftDeletes;

class Post extends Model
{
    use SoftDeletes;
    
    // ソフトデリートされたレコードはデフォルトで除外される
    // 含めるには:
    // Post::withTrashed()->get();
    // 削除済みのみを取得:
    // Post::onlyTrashed()->get();
}

ソフトデリートはdeleted_atカラムを追加します。明示的に要求しない限り、クエリはソフトデリートされたレコードを自動的に除外します。これはユニーク制約に影響し、最適なパフォーマンスのためにdeleted_atを含む複合インデックスが必要になります。

サービスコンテナと依存性注入

サービスコンテナはLaravelの中核です。バインディング、解決、コンテキスト注入の理解が、ジュニアとシニア候補者を区別します。

Q: サービスコンテナとは何ですか?なぜ重要ですか?

サービスコンテナはクラスの依存関係を管理し、依存性注入を実行します。クラスを自動的に解決し、疎結合とテスタビリティを実現します。

app/Providers/AppServiceProvider.phpphp
public function register(): void
{
    // インターフェースバインディング
    $this->app->bind(
        PaymentGatewayInterface::class,
        StripePaymentGateway::class
    );
    
    // シングルトン: 毎回同じインスタンス
    $this->app->singleton(ReportGenerator::class, function ($app) {
        return new ReportGenerator($app->make(Cache::class));
    });
}

Q: bind()singleton()instance()の違いは何ですか?

  • bind(): クラスが解決されるたびに新しいインスタンスを作成
  • singleton(): 1つのインスタンスを作成し、以降の解決で同じインスタンスを返す
  • instance(): 既存のオブジェクトインスタンスをコンテナにバインド
app/Providers/AppServiceProvider.phpphp
// bind: 毎回新しいインスタンス
$this->app->bind(Service::class, fn() => new Service());

// singleton: リクエストライフサイクル全体で1つのインスタンス
$this->app->singleton(Cache::class, fn() => new RedisCache());

// instance: すでにインスタンス化されたオブジェクトをバインド
$config = new Config(['debug' => true]);
$this->app->instance(Config::class, $config);

サービスコンテナの概念については、サービスコンテナ&DIモジュールで練習できます。

Laravelの面接対策はできていますか?

インタラクティブなシミュレーター、flashcards、技術テストで練習しましょう。

認証と認可パターン

Laravel 13では、既存の方法に加えてPasskey認証が導入されました。面接官はSanctum、Passport、ポリシー、ゲートの知識を期待します。

Q: SanctumとPassportはどのような場合に使い分けますか?

機能SanctumPassport
ユースケースSPA、モバイルアプリ、シンプルなAPIトークンOAuth2サーバー、サードパーティアクセス
トークンタイプシンプルなAPIトークン、セッションベースOAuth2アクセストークン、リフレッシュトークン
複雑さ最小限のセットアップ完全なOAuth2実装
トークンスコープアビリティ(よりシンプル)OAuthスコープ

Sanctumはほとんどのアプリケーションに適しています。Passportは、アプリケーションがサードパーティクライアント向けのOAuth2プロバイダーとして機能する必要がある場合に必要です。詳細な比較についてはLaravel Sanctum vs Passportを参照してください。

Q: ポリシーとゲートの違いは何ですか?

ゲートはクロージャベースの認可チェックです。ポリシーは特定のモデルの認可ロジックをグループ化するクラスです。

app/Policies/PostPolicy.phpphp
class PostPolicy
{
    public function update(User $user, Post $post): bool
    {
        return $user->id === $post->user_id;
    }
    
    public function delete(User $user, Post $post): bool
    {
        return $user->id === $post->user_id 
            || $user->hasRole('admin');
    }
}

// コントローラーでの使用
public function update(Request $request, Post $post)
{
    $this->authorize('update', $post); // PostPolicyを使用
    // ... 更新ロジック
}

認可&ポリシーモジュールでは、高度な認可パターンをカバーしています。

キューとジョブ処理

キューはスケーラブルなLaravelアプリケーションに不可欠です。面接官はジョブ設計、失敗処理、キュードライバーの理解を調べます。

Q: Laravelで失敗したジョブをどのように処理しますか?

app/Jobs/ProcessPodcast.phpphp
class ProcessPodcast implements ShouldQueue
{
    use Queueable;
    
    public int $tries = 3;
    public int $backoff = 60; // リトライ間の秒数
    public int $timeout = 120;
    
    public function handle(): void
    {
        // ジョブロジック
    }
    
    public function failed(Throwable $exception): void
    {
        // 管理者に通知、外部サービスにログ
        Log::error('ポッドキャスト処理が失敗しました', [
            'podcast_id' => $this->podcast->id,
            'error' => $exception->getMessage()
        ]);
    }
}

失敗したジョブはfailed_jobsテーブルに保存されます。php artisan queue:retryで特定のジョブを再試行するか、queue:retry allで一括再試行できます。

Q: dispatch()dispatchSync()の違いは何ですか?

  • dispatch(): 非同期処理のためにジョブをキューにプッシュ
  • dispatchSync(): キューをバイパスして、現在のプロセスでジョブを即座に実行

dispatchSync()はテストや結果がすぐに必要な場合に便利です。本番環境では、リクエストをブロックしないように、ほとんどのジョブはdispatch()を使用する必要があります。

Pestを使用したLaravelテスト

Laravel 13はデフォルトのテストフレームワークとしてPestを同梱しています。面接官は機能テスト、ユニットテスト、モック、データベーステスト戦略の理解を評価します。

Q: 外部APIに依存するコントローラーをどのようにテストしますか?

tests/Feature/PaymentTest.phpphp
use App\Services\PaymentGateway;
use App\Services\FakePaymentGateway;

test('支払いが正常に処理される', function () {
    // テスト用にフェイク実装をバインド
    $this->app->bind(
        PaymentGateway::class,
        FakePaymentGateway::class
    );
    
    $response = $this->postJson('/api/payments', [
        'amount' => 1000,
        'currency' => 'usd'
    ]);
    
    $response->assertStatus(200)
        ->assertJson(['status' => 'completed']);
});

test('支払いがゲートウェイエラーを処理する', function () {
    $mock = Mockery::mock(PaymentGateway::class);
    $mock->shouldReceive('charge')
        ->once()
        ->andThrow(new PaymentFailedException('カード拒否'));
    
    $this->app->instance(PaymentGateway::class, $mock);
    
    $response = $this->postJson('/api/payments', [
        'amount' => 1000,
        'currency' => 'usd'
    ]);
    
    $response->assertStatus(422);
});

Q: RefreshDatabaseDatabaseTransactionsの違いは何ですか?

  • RefreshDatabase: テストクラスごとに1回データベースをマイグレーションし、各テストをトランザクションでラップ
  • DatabaseTransactions: データベースがすでにマイグレーション済みであることを前提とし、各テストをトランザクションでラップ

RefreshDatabaseはCI/CDパイプラインでより安全です。DatabaseTransactionsはスキーマが安定している場合のローカル開発で高速です。

テストのベストプラクティスについては、Pestを使用したLaravelテストを参照してください。

Laravel 13固有の質問

面接官はLaracon EU 2026で発表されたLaravel 13の機能についてますます質問するようになっています。

Q: Laravel AI SDKとは何ですか?いつ使用しますか?

Laravel AI SDKは、AI操作のための統一APIを提供します:テキスト生成、埋め込み、ツール呼び出しエージェント、オーディオ、画像生成。OpenAI、Anthropic、その他のプロバイダー間の違いを抽象化します。

config/ai.phpでデフォルトプロバイダーを定義php
// アプリケーションコードでの使用
use Illuminate\Support\Facades\AI;

$response = AI::text('この記事を開発者向けに要約')
    ->withContext($articleContent)
    ->generate();

// セマンティック検索用の埋め込み
$embedding = AI::embeddings($searchQuery)->generate();
$results = Post::query()
    ->nearestNeighbors('embedding', $embedding, 10)
    ->get();

SDKは、複数のプロバイダーSDKを管理せずにAI機能を必要とするアプリケーションに適しています。

Q: Laravel 13でPHP Attributesはどのように機能しますか?

Laravel 13では、コンポーネント設定のクラスプロパティの代替として、PHP 8 Attributesが導入されました。これは非破壊的変更であり、プロパティベースの設定は引き続き機能します。

php
// 従来のアプローチ
class SendWelcomeEmail implements ShouldQueue
{
    public $queue = 'emails';
    public $tries = 3;
}

// AttributesによるLaravel 13
use Illuminate\Contracts\Queue\Attributes\Queue;
use Illuminate\Contracts\Queue\Attributes\Tries;

#[Queue('emails')]
#[Tries(3)]
class SendWelcomeEmail implements ShouldQueue
{
    // よりクリーンなクラス本体
}

AttributesはIDEサポートが向上し、設定をクラス定義レベルで可視化できます。

今すぐ練習を始めましょう!

面接シミュレーターと技術テストで知識をテストしましょう。

2026年Laravel面接の重要ポイント

  • with()による即時ロードをマスターし、開発環境でN+1クエリをキャッチするストリクトモードを理解する
  • サービスコンテナのバインディングを説明できるようにする:一時的なものにはbind()、共有インスタンスにはsingleton()、インターフェース解決にはコンテキストバインディング
  • SanctumとPassportの使い分けを知る:ファーストパーティアプリにはSanctum、OAuth2プロバイダーシナリオにはPassport
  • $tries$backofffailed()メソッドによるキュー失敗処理を実演できる
  • Pestでテストを書き、外部依存にはモックを使用し、RefreshDatabaseDatabaseTransactionsの違いを理解する
  • Laravel 13の機能に精通する:統一AI操作用のAI SDK、よりクリーンなコンポーネント設定用のPHP Attributes、Passkey認証
  • 実装だけでなくトレードオフを説明する練習をする:面接官は暗記よりも推論を重視する
今日のチャレンジ

Laravel のバグを見つけられますか

実際のコード、隠れたバグ、1日1回。アカウントなしで試せます。

Anthony Fillion-Maillet

執筆

Anthony Fillion-Maillet

SharpSkill 創業者

10 年以上フルスタック開発に携わっています。SharpSkill を運営し、ここで公開される内容に責任を負っています。

2026年9月7日 更新

共有

関連記事