🛠

Laravelで依頼マッチングサービス『Requste』を作り始めた

に公開
2025/12/23

はじめに

なぜこのプロダクトを作ろうと思ったか

SNS上には、
イラストが上手く、単価も良心的なのに
他のクリエイターに埋もれてしまっている方が数多くいます。

それを見るたびに、
「運や見られ方だけで評価されず、埋もれてしまうのは
あまりにもったいない」と強く感じてきました。

実力はあるのに、実績がないという理由だけで
仕事を得にくいクリエイターがいる。

そんな方々に、
活躍の機会を届けたい。

その想いから、このプロダクトを作ろうと思いました。

Requste(リクステ)仕様まとめ(MVP)

サービス概要

『Requste(リクステ)』は、

依頼者(Client)と制作者(Creator)をつなぐ、依頼マッチングサービス

のMVPです。

想定ユーザーとロール

本サービスでは、すべての利用者を User として統一管理し、
ロールによって役割を切り替える設計を採用しています。

  • Client
    依頼(案件)を作成・管理するユーザー

  • Creator
    依頼を閲覧し、将来的に受注するユーザー

  • Admin
    運営管理用(MVPでは画面未実装、将来拡張用)

ロールは enum(UserRole) で管理し、
将来ロールが増えても拡張しやすい設計にしています。

現在実装済みの機能

Client 機能

ログイン
自分が作成した案件の一覧表示
案件が0件の場合の正常表示

共通

ロールによるアクセス制御
不正アクセス時の 403 制御
MVC(Route → Controller → View)の基本構造

今回やったこと

  • 認証
  • ロール設計

詰まったところ

許可されていないロールでも特定の画面を閲覧できたこと

その時実装していたのが以下のコード

if (!$user && in_array($user->role->value, $roles, true)) {
    abort(403);
}

一見問題ないように見えるが、論理が破綻している
これを日本語に翻訳すると

「ユーザーが存在しない かつ ユーザーの role が許可 $roles に含まれている場合」→ 403 を表示

となる。

・ユーザーが存在しない
・ユーザーの role が許可 $roles に含まれている場合

ユーザーが存在していないのに、そのユーザーのrolesについて確認していることになるため403が起動しなかった。

修正後の条件

この部分のミドルウェアの責務は

・ログインしていない → 拒否
・ログインしているが role が違う → 拒否
・それ以外 → 通す

となるため、これを表現する必要がある。
そのため、

if (! $user || ! in_array($user->role->value, $roles, true)) {
    abort(403);
}

と修正。
この論理にしたところ問題なく 403 表示となった。

このことから学んだこと

  • 拒否条件は「通したくない条件」
  • role 判定は 否定形で書く方が安全
  • AND / OR は日本語に直してから書く

となった。

次にやること

MVP フェーズ1の予定

・案件作成機能(client)
・案件詳細ページ
・案件の公開 / 非公開(または受付中 / 終了)
GitHubで編集を提案

Discussion