bear-app は BEAR.Sunday フレームワークをベースにした、Web アプリケーションです。
DDD(Domain-Driven Design)と CQRS(Command Query Responsibility Segregation)アーキテクチャを採用し、
堅牢で保守性の高い設計を実現しています。
- DDD + CQRS アーキテクチャ: 190個以上の PHP ファイルによる本格的な DDD 実装
- 高度なセキュリティ: Cloudflare Turnstile、レート制限、パスワード保護、アカウントロック
- 完全な認証・認可システム: リソース単位の権限管理、パスワード再確認機能
- メール管理機能: キュー、スケジュール送信、テンプレートエンジン連携
- REST API 対応: HAL+JSON フォーマットサポート
- AOP による横断的関心事の分離: アトリビュートベースのインターセプター
- PHP 8.3 以上
- MySQL 8.0 以上
- Composer
- Node.js & npm(フロントエンドビルド用)
- Framework / BEAR.Sunday
- Template Engine / Qiq
- Form / Aura.Input, Aura.Filter
- Session / Aura.Session
- Auth / Aura.Auth
- Router / Aura.Router
- Media / Ray.MediaQuery
- AOP / Ray.AOP
- DI / Ray.Di
- Env / env-json
- Mail / PHPMailer
- CSS / Tailwind CSS
- JavaScript bundler / Rollup
graph TD;
Login --> Index;
Index --> Settings/Index;
Settings/Index --> Settings/Emails;
Settings/Emails --> EmailVerify;
Login --> ForgotPassword;
ForgotPassword --> CodeVerify;
CodeVerify --> ResetPassword;
Login --> Join;
Join --> CodeVerify;
CodeVerify --> SignUp;
Index --> PasswordProtect;
Index --> Settings/Password;
PasswordProtect --> Settings/Password;
- ログイン・ログアウト: ID & パスワード認証
- Remember me: 自動ログイン機能(トークンベース)
- パスワードリセット: メール経由のパスワードリセット
- アカウント作成: 招待メール経由の新規アカウント作成
- アカウント削除: 論理削除による安全なアカウント削除
- パスワード再確認: 重要な操作前のパスワード再入力(5分間有効)
- リソース単位の権限制御:
#[RequiredPermission]アトリビュート - 3段階の権限レベル:
Privilege: 全権限Read: 読み取り権限Write: 書き込み権限
- Allow/Deny ルール: 柔軟なアクセス制御
- 管理者と同様の認証基盤
#[UserGuard]アトリビュートによる保護
- メール送信キュー: 即時送信・スケジュール送信対応
- リトライ機能: 送信失敗時の自動再試行
- テンプレートエンジン連携: HTML/テキスト形式のメールテンプレート
- 実装済みメールテンプレート:
- 管理者招待メール
- パスワードリセットメール
- メールアドレス確認メール
- パスワード変更通知メール
- アカウント削除通知メール
- 複数メールアドレス管理: 管理者ごとに複数のメールアドレスを登録可能
- メールアドレス検証: 確認メールによる所有権確認
- Cloudflare Turnstile: ログイン・パスワードリセット時のボット対策
- Throttling: IP + URI ベースのレート制限
#[RateLimiter]アトリビュート: 柔軟なレート制限設定- 429 Too Many Requests: 制限超過時の適切なレスポンス
- ログイン試行制限: 連続10回失敗でアカウントロック(30分間)
- パスワード保護: 重要操作前のパスワード再確認(5分間有効)
- 危険なパスワードのブラックリスト: よく使われる脆弱なパスワードを禁止
- パスワード変更通知: パスワード変更時にメール通知
- メールアドレス追加通知: 新しいメールアドレス追加時に通知
- メールアドレス確認: 確認メールによる検証
- Aura.Session FlashMessenger による一時メッセージ表示
- 成功/エラー/警告メッセージの表示
- HAL+JSON 対応:
Accept: application/jsonヘッダーで API レスポンス - リソース指向: BEAR.Sunday の RESTful アーキテクチャ
- 危険なパスワードのインポート:
php ./bin/command.php post /import-bad-passwords
- スケジュール済みメールの送信:
php ./bin/command.php post /send-email-from-email-queue
- 削除済み管理者の完全削除:
php ./bin/command.php post /delete-admins
本プロジェクトは DDD(Domain-Driven Design) と CQRS(Command Query Responsibility Segregation) を採用しています。
- 場所:
source/app/ddd/core/src/Domain/ - 責務: ビジネスロジックの中核
- 構成要素:
- Entity / Value Object
- Domain Service(22個のサブドメイン)
- Repository Interface
- Domain Exception
実装済みドメイン:
- AccessControl(権限管理)
- Admin(管理者)
- AdminPermission(管理者権限)
- AdminToken(トークン)
- Auth(認証)
- Captcha(キャプチャ)
- Encrypter(暗号化)
- FlashMessenger(フラッシュメッセージ)
- Hasher(ハッシュ)
- Language(多言語)
- Mail(メール)
- SecureRandom(安全な乱数)
- Session(セッション)
- Throttle(レート制限)
- UrlSignature(URL署名)
- User(ユーザー)
- VerificationCode(検証コード)
- 場所:
source/app/ddd/core/src/Application/ - 責務: ユースケースの実装
- 構成要素:
- Use Case(15個)
- InputData / OutputData
実装済みユースケース:
- CreateAdminUseCase
- DeleteAdminUseCase
- UpdateAdminPasswordUseCase
- CreateAdminEmailUseCase
- VerifyAdminEmailUseCase
- ForgotAdminPasswordUseCase
- ResetAdminPasswordUseCase
- JoinAdminUserCase
- SendEmailFromEmailQueueUseCase
- など
- 場所:
source/app/ddd/core/src/Infrastructure/ - 責務: 技術的実装の詳細
- 構成要素:
- Entity(データベース Entity)
- Persistence(Repository 実装)
- Query / Command(CQRS の Query/Command)
- Shared(共通実装)
- 場所:
source/app/src/ - 責務: ユーザーインターフェース
- 構成要素:
- Resource Object(BEAR.Sunday のリソース)
- Form
- Interceptor(AOP)
- Template
- Query(読み取り): Ray.MediaQuery を使用した SQL ファイルベースのクエリ
- 場所:
source/app/ddd/core/src/Infrastructure/Query/ - SQL:
source/app/var/sql/
- 場所:
- Command(書き込み): Repository パターンによるドメインモデル操作
- 場所:
source/app/ddd/core/src/Infrastructure/Persistence/
- 場所:
Ray.Aop を使用したアトリビュートベースのインターセプター実装。
実装済みインターセプター(12個):
- AdminAuthGuardian(認証チェック)
- AdminAuthentication(ログイン・ログアウト)
- AdminPasswordProtector(パスワード保護)
- AdminAuthorization(権限チェック)
- CloudflareTurnstileVerification(ボット対策)
- Throttling(レート制限)
- FormValidation(フォーム検証)
- TransactionalInterceptor(トランザクション管理)
- など
Ray.Di を使用したコンストラクタインジェクション。
設定場所: source/app/src/Module/
- AppModule
- DevModule / ProdModule
- HtmlModule / HalModule
MySQL 8.0 以上
| テーブル名 | 説明 |
|---|---|
admins |
管理者アカウント |
admin_emails |
管理者メールアドレス(複数登録可能) |
admin_permissions |
管理者権限(リソース・権限レベル) |
admin_tokens |
Remember me トークン |
admin_deletes |
削除済み管理者(論理削除) |
| テーブル名 | 説明 |
|---|---|
users |
ユーザーアカウント |
| テーブル名 | 説明 |
|---|---|
email_queues |
メール送信キュー |
email_queue_recipients |
メール受信者 |
| テーブル名 | 説明 |
|---|---|
throttles |
レート制限記録(IP + URI) |
verification_codes |
検証コード(メール確認用) |
bad_passwords |
危険なパスワードリスト |
- スキーマファイル:
source/app/var/schema/mysql/ - SQL ファイル:
source/app/var/sql/
source/app/
├── bin/ # コマンドラインツール
│ ├── command.php # コマンド実行
│ └── page.php # ページ実行
├── ddd/core/ # DDD 実装(190個のファイル)
│ ├── src/
│ │ ├── Domain/ # ドメイン層(22サブドメイン)
│ │ ├── Application/ # アプリケーション層(15 UseCase)
│ │ └── Infrastructure/ # インフラ層
│ │ ├── Entity/ # DB Entity
│ │ ├── Persistence/ # Repository 実装
│ │ └── Query/ # CQRS Query/Command
│ └── tests/ # テストコード
├── src/ # プレゼンテーション層
│ ├── Annotation/ # アトリビュート定義(15個)
│ ├── Interceptor/ # AOP インターセプター(12個)
│ ├── Resource/ # BEAR.Sunday リソース
│ │ ├── Page/ # ページリソース(Admin/User)
│ │ ├── App/ # API リソース
│ │ └── Command/ # コマンドリソース
│ ├── Form/ # フォーム定義
│ ├── InputQuery/ # 入力バリデーション
│ ├── Module/ # DI モジュール設定
│ ├── Provider/ # プロバイダー(8個)
│ └── TemplateEngine/ # Qiq テンプレート設定
├── var/
│ ├── schema/ # DB スキーマ(MySQL)
│ ├── sql/ # SQL 定義ファイル
│ ├── qiq/template/ # Qiq テンプレート
│ ├── email/ # メールテンプレート
│ └── lang/ja/ # 日本語言語ファイル
└── public/ # ドキュメントルート
├── index.php # エントリーポイント
└── admin-src/ # フロントエンドソース(Tailwind CSS)
cd source/app
composer installcd source/app/public/admin-src
npm install
npm run build
npm run tailwindcss# データベース作成
mysql -u root -p
CREATE DATABASE bear_app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON bear_app.* TO 'your_user'@'localhost';
# スキーマのインポート
mysql -u your_user -p bear_app < source/app/var/schema/mysql/schema.sql.env.json ファイルを作成し、データベース接続情報を設定します。
{
"DB_DSN": "mysql:host=localhost;dbname=bear_app",
"DB_USER": "your_user",
"DB_PASS": "your_password"
}cd docker
./docker-startup.shhttp://localhost/admin/login
- PSR-12 準拠
- PHPStan Level 8
cd source/app
composer testscd source/app/public/admin-src
npm run build
npm run tailwindcss