システムアーキテクチャ & 人材採用プラットフォーム
Symfonyで構築された、ホテル・飲食業界(HORECA)特化型の人材採用Webプラットフォーム。専任コンサルタントによる二段階承認(RBAC)、KnpPaginatorを用いた非同期AJAX検索エンジン、REST APIエンドポイントを統合しています。
┌─────────────────────────────────────────────────────────────────────────────┐
│ TRT Conseil — Architecture RH & Recrutement │
└──────────────────────────────────────┬──────────────────────────────────────┘
│
┌───────────────────────────┼───────────────────────────┐
▼ ▼ ▼
🛡️ Sécurité & Modération RBAC 🔍 Moteur de Recherche AJAX 📡 API REST Headless
• Double validation (TOVALID)• Filter.js sans rechargement• JMS Serializer Groups
• 4 Rôles isolés (Admin/RH) • KnpPaginator (6/page) • Endpoints paginés (/api)
• Upload sécurisé de CV PDF • Synchronisation URL HTML5 • Support mobile & tiers
• Envoi CV par Symfony Mailer• Requête optimisée Doctrine • Documentation JSON
人の介在価値を高めた飲食・宿泊業採用
すべてのアカウント、求人情報、応募データは、マッチング前に専門のHRコンサルタントによって審査・承認されます。
セキュリティ & ロール階層
未承認の公開を防ぐ一時的なTOVALIDステータスを備えた、4つの分離されたロール権限体系。
履歴書PDFの自動送信
コンサルタントの承認時、Symfony Mailerにより候補者のPDF履歴書を自動添付して求人企業へ送信。
1. セキュリティモデル & 権限管理 (RBAC)
Symfony Securityコンポーネントによる厳格なアクセス階層と事前の人的審査:
| システムロール |
ステータス |
権限 & 実行可能操作 |
ROLE_ADMIN |
管理者 |
管理者およびコンサルタントアカウントの登録、編集、一時停止、削除。 |
ROLE_CONSULTANT |
HRモデレーター |
候補者・企業の審査、求人票の公開承認、企業への履歴書データ転送。 |
ROLE_RECRUTEUR |
求人企業 |
企業プロフィール管理、求人票の作成、事前選考済み応募者の確認。 |
ROLE_CANDIDAT |
求職者 |
PDF履歴書のセキュアな登録、求人詳細検索、承認済み求人への応募。 |
2. 業務ワークフロー & 応募処理プロセス
採用の各ステップにおいて確実なチェックを行うための構造化されたフロー:
求職者フロー & PDF履歴書管理
transliterator_transliterate()で安全にファイル名をサニタイズしたPDFアップロードと進行状況の追跡。
PDF Uploadtransliteratortovalid
コンサルタントフロー & 自動通知送信
未処理の応募内容を審査し、承認と同時に求人企業へPDFを添付したメールを自動配信。
Symfony MailerDataPartPièce jointe CV
3. 非同期AJAX検索エンジン
JavaScript Filter.jsモジュール、KnpPaginator、Doctrine QueryBuilderを組み合わせたリロード不要の即時検索:
// Requête QueryBuilder optimisée dans AnnonceRepository.php
private function getSearchQuery(SearchData $search): QueryBuilder
{
$query = $this->createQueryBuilder('p')
->select('c', 'p')
->join('p.poste', 'c')
->orderBy('p.id', 'DESC');
if (!empty($search->q)) {
$query->andWhere('p.titre LIKE :q')
->setParameter('q', "%{$search->q}%");
}
if (!empty($search->poste)) {
$query->andWhere('c.id IN (:poste)')
->setParameter('poste', $search->poste);
}
return $query;
}
- リアルタイムイベントリスナー: テキスト入力や職種チェックボックスの変更を検知し、部分的なDOM描画を実行。
- KnpPaginatorによるページネーション: サーバーメモリ消費を抑制するため、1ページあたり6件にデータを分割。
- HTML5ブラウザ履歴同期 (replaceState): URLを動的に更新し、絞り込み結果リンクをそのまま共有可能。
4. ヘッドレストREST API仕様
JMS SerializerでシリアライズされたJSONエンドポイント:
| Method |
Endpoint URL |
JMSグループ |
エンドポイントの概要 |
| GET |
/api/annonces |
getAnnonces |
公開承認済みの全求人リストをJSON形式で取得 |
| GET |
/api/annoncesby?page={n} |
getAnnonces |
ページネーションメタデータを含む求人情報一覧の取得 |
| GET |
/api/annonce/{id} |
getAnnonces |
指定IDの求人情報の完全な詳細を取得 |
| GET |
/api/annoncesby/{poste} |
getAnnonces |
職種名に基づいた求人情報の絞り込みと取得 |
5. データモデル & ORMリレーション
Doctrineの参照整合性ルールに基づき正規化されたMySQLリレーショナルスキーマ:
ユーザー & プロフィールエンティティ
一意のメールアドレスを持つUser、PDFパスを持つCandidat、企業情報のRecruteur。
求人票 & 職種マスター
28種類の飲食・宿泊職種マスターPosteと、契約形態や給与を保持するAnnonce。
Candidature 応募エンティティ
Annonce、Candidat、審査担当Consultantをステータスとともに紐付ける中間テーブル。