moai-adk 0.34.0__py3-none-any.whl → 1.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- moai_adk/__main__.py +136 -5
- moai_adk/astgrep/__init__.py +37 -0
- moai_adk/astgrep/analyzer.py +522 -0
- moai_adk/astgrep/models.py +124 -0
- moai_adk/astgrep/rules.py +179 -0
- moai_adk/cli/commands/analyze.py +11 -2
- moai_adk/cli/commands/doctor.py +7 -1
- moai_adk/cli/commands/init.py +321 -11
- moai_adk/cli/commands/language.py +7 -1
- moai_adk/cli/commands/rank.py +449 -0
- moai_adk/cli/commands/status.py +7 -1
- moai_adk/cli/commands/switch.py +325 -0
- moai_adk/cli/commands/update.py +296 -23
- moai_adk/cli/prompts/init_prompts.py +362 -66
- moai_adk/cli/prompts/translations/__init__.py +573 -0
- moai_adk/cli/ui/prompts.py +61 -2
- moai_adk/cli/worktree/cli.py +106 -1
- moai_adk/cli/worktree/manager.py +155 -0
- moai_adk/core/config/unified.py +244 -63
- moai_adk/core/credentials.py +264 -0
- moai_adk/core/error_recovery_system.py +22 -4
- moai_adk/core/git/conflict_detector.py +10 -1
- moai_adk/core/git/event_detector.py +16 -5
- moai_adk/core/integration/engine.py +2 -2
- moai_adk/core/integration/integration_tester.py +5 -5
- moai_adk/core/language_config_resolver.py +9 -3
- moai_adk/core/merge/analyzer.py +509 -324
- moai_adk/core/migration/alfred_to_moai_migrator.py +7 -1
- moai_adk/core/migration/backup_manager.py +54 -4
- moai_adk/core/migration/file_migrator.py +174 -2
- moai_adk/core/migration/interactive_checkbox_ui.py +42 -31
- moai_adk/core/migration/version_detector.py +123 -19
- moai_adk/core/migration/version_migrator.py +44 -9
- moai_adk/core/model_allocator.py +241 -0
- moai_adk/core/project/backup_utils.py +12 -2
- moai_adk/core/project/initializer.py +44 -87
- moai_adk/core/project/phase_executor.py +95 -33
- moai_adk/core/project/validator.py +16 -1
- moai_adk/core/quality/trust_checker.py +30 -10
- moai_adk/core/rollback_manager.py +60 -25
- moai_adk/core/template/backup.py +88 -6
- moai_adk/core/template/config.py +33 -9
- moai_adk/core/template/merger.py +34 -8
- moai_adk/core/template/processor.py +334 -11
- moai_adk/core/template_engine.py +10 -1
- moai_adk/core/template_variable_synchronizer.py +16 -2
- moai_adk/core/version_sync.py +54 -6
- moai_adk/foundation/__init__.py +1 -20
- moai_adk/foundation/testing.py +1 -1
- moai_adk/loop/__init__.py +54 -0
- moai_adk/loop/controller.py +305 -0
- moai_adk/loop/feedback.py +230 -0
- moai_adk/loop/state.py +209 -0
- moai_adk/loop/storage.py +220 -0
- moai_adk/lsp/__init__.py +70 -0
- moai_adk/lsp/client.py +320 -0
- moai_adk/lsp/models.py +261 -0
- moai_adk/lsp/protocol.py +404 -0
- moai_adk/lsp/server_manager.py +248 -0
- moai_adk/project/configuration.py +8 -1
- moai_adk/py.typed +0 -0
- moai_adk/ralph/__init__.py +37 -0
- moai_adk/ralph/engine.py +307 -0
- moai_adk/rank/__init__.py +21 -0
- moai_adk/rank/auth.py +425 -0
- moai_adk/rank/client.py +557 -0
- moai_adk/rank/config.py +147 -0
- moai_adk/rank/hook.py +1503 -0
- moai_adk/rank/py.typed +0 -0
- moai_adk/statusline/__init__.py +3 -0
- moai_adk/statusline/enhanced_output_style_detector.py +5 -5
- moai_adk/statusline/main.py +20 -1
- moai_adk/statusline/memory_collector.py +268 -0
- moai_adk/statusline/renderer.py +54 -38
- moai_adk/tag_system/__init__.py +48 -0
- moai_adk/tag_system/atomic_ops.py +117 -0
- moai_adk/tag_system/linkage.py +335 -0
- moai_adk/tag_system/parser.py +176 -0
- moai_adk/tag_system/validator.py +200 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +19 -3
- moai_adk/templates/.claude/agents/moai/builder-command.md +62 -16
- moai_adk/templates/.claude/agents/moai/builder-plugin.md +763 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +21 -5
- moai_adk/templates/.claude/agents/moai/expert-backend.md +103 -39
- moai_adk/templates/.claude/agents/moai/expert-debug.md +9 -3
- moai_adk/templates/.claude/agents/moai/expert-devops.md +16 -14
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +45 -31
- moai_adk/templates/.claude/agents/moai/expert-performance.md +13 -9
- moai_adk/templates/.claude/agents/moai/expert-refactoring.md +228 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +19 -3
- moai_adk/templates/.claude/agents/moai/expert-testing.md +13 -9
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +8 -2
- moai_adk/templates/.claude/agents/moai/manager-docs.md +10 -5
- moai_adk/templates/.claude/agents/moai/manager-git.md +99 -27
- moai_adk/templates/.claude/agents/moai/manager-project.md +87 -7
- moai_adk/templates/.claude/agents/moai/manager-quality.md +22 -5
- moai_adk/templates/.claude/agents/moai/manager-spec.md +8 -2
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +45 -14
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +16 -3
- moai_adk/templates/.claude/commands/moai/0-project.md +239 -1185
- moai_adk/templates/.claude/commands/moai/1-plan.md +383 -363
- moai_adk/templates/.claude/commands/moai/2-run.md +254 -347
- moai_adk/templates/.claude/commands/moai/3-sync.md +174 -100
- moai_adk/templates/.claude/commands/moai/9-feedback.md +49 -33
- moai_adk/templates/.claude/commands/moai/alfred.md +339 -0
- moai_adk/templates/.claude/commands/moai/cancel-loop.md +163 -0
- moai_adk/templates/.claude/commands/moai/fix.md +264 -0
- moai_adk/templates/.claude/commands/moai/loop.md +363 -0
- moai_adk/templates/.claude/hooks/moai/lib/README.md +143 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +37 -81
- moai_adk/templates/.claude/hooks/moai/lib/alfred_detector.py +105 -0
- moai_adk/templates/.claude/hooks/moai/lib/atomic_write.py +122 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +4 -1
- moai_adk/templates/.claude/hooks/moai/lib/common.py +35 -5
- moai_adk/templates/.claude/hooks/moai/lib/config.py +376 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +24 -28
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +14 -14
- moai_adk/templates/.claude/hooks/moai/lib/enhanced_output_style_detector.py +372 -0
- moai_adk/templates/.claude/hooks/moai/lib/exceptions.py +171 -0
- moai_adk/templates/.claude/hooks/moai/lib/file_utils.py +95 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_collector.py +190 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +15 -13
- moai_adk/templates/.claude/hooks/moai/lib/language_detector.py +298 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +125 -25
- moai_adk/templates/.claude/hooks/moai/lib/main.py +341 -0
- moai_adk/templates/.claude/hooks/moai/lib/memory_collector.py +268 -0
- moai_adk/templates/.claude/hooks/moai/lib/metrics_tracker.py +78 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +9 -7
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +204 -13
- moai_adk/templates/.claude/hooks/moai/lib/project.py +23 -14
- moai_adk/templates/.claude/hooks/moai/lib/renderer.py +359 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_linkage.py +333 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_parser.py +176 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_validator.py +200 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +5 -5
- moai_adk/templates/.claude/hooks/moai/lib/tool_registry.py +896 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +30 -18
- moai_adk/templates/.claude/hooks/moai/lib/update_checker.py +129 -0
- moai_adk/templates/.claude/hooks/moai/lib/version_reader.py +741 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__ast_grep_scan.py +276 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__code_formatter.py +255 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__coverage_guard.py +325 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__linter.py +315 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__lsp_diagnostic.py +508 -0
- moai_adk/templates/.claude/hooks/moai/pre_commit__tag_validator.py +287 -0
- moai_adk/templates/.claude/hooks/moai/pre_tool__security_guard.py +268 -0
- moai_adk/templates/.claude/hooks/moai/pre_tool__tdd_enforcer.py +208 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +93 -61
- moai_adk/templates/.claude/hooks/moai/session_end__rank_submit.py +69 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +165 -70
- moai_adk/templates/.claude/hooks/moai/shared/utils/announcement_translator.py +206 -0
- moai_adk/templates/.claude/hooks/moai/stop__loop_controller.py +621 -0
- moai_adk/templates/.claude/output-styles/moai/alfred.md +758 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +86 -3
- moai_adk/templates/.claude/output-styles/moai/yoda.md +2 -2
- moai_adk/templates/.claude/settings.json +154 -77
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +252 -198
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +169 -323
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +39 -27
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +115 -125
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +150 -150
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +182 -175
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +198 -138
- moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +226 -320
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +43 -222
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +75 -219
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +103 -463
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/component-architecture.md +723 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/nextjs16-patterns.md +713 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/performance-optimization.md +694 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/react19-patterns.md +591 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/state-management.md +680 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/vue35-patterns.md +802 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +118 -339
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +74 -377
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +299 -70
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +205 -182
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/advanced-agent-patterns.md +370 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-cli-reference-official.md +420 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +32 -22
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-devcontainers-official.md +381 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-discover-plugins-official.md +379 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-headless-official.md +378 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +110 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugin-marketplaces-official.md +308 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugins-official.md +640 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sandboxing-official.md +282 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +425 -71
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-statusline-official.md +293 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +325 -143
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +96 -316
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +116 -294
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-advanced.md +279 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-implementation.md +267 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +121 -650
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/patterns.md +22 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-ears-format.md +200 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +37 -730
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-tdd-implementation.md +275 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +77 -819
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-implementation.md +244 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-validation.md +219 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +14 -18
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +86 -270
- moai_adk/templates/.claude/skills/moai-framework-electron/SKILL.md +288 -0
- moai_adk/templates/.claude/skills/moai-framework-electron/examples.md +2082 -0
- moai_adk/templates/.claude/skills/moai-framework-electron/reference.md +1649 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +76 -582
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +1239 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/modules/advanced-patterns.md +401 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +1136 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +82 -436
- moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +585 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/aspnet-core.md +627 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/blazor-components.md +767 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/cqrs-validation.md +626 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/csharp12-features.md +580 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/efcore-patterns.md +622 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +403 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +65 -542
- moai_adk/templates/.claude/skills/moai-lang-elixir/examples.md +1171 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/modules/advanced-patterns.md +531 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/reference.md +889 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +32 -405
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +114 -293
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +83 -307
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +179 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +973 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +1543 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +42 -279
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +94 -556
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +1608 -0
- moai_adk/templates/.claude/skills/moai-lang-php/modules/advanced-patterns.md +538 -0
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +1323 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +108 -358
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +84 -482
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +1154 -0
- moai_adk/templates/.claude/skills/moai-lang-r/modules/advanced-patterns.md +489 -0
- moai_adk/templates/.claude/skills/moai-lang-r/reference.md +1087 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +106 -610
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +1106 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/modules/advanced-patterns.md +309 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/modules/testing-patterns.md +306 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +1024 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +51 -265
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +106 -442
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/akka-actors.md +479 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/cats-effect.md +489 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/functional-programming.md +460 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/spark-data.md +498 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/zio-patterns.md +541 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +88 -457
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/combine-reactive.md +256 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/concurrency.md +270 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/swift6-features.md +265 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/swiftui-patterns.md +314 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +75 -283
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +97 -252
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +64 -240
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +331 -12
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +330 -37
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +90 -287
- moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +200 -206
- moai_adk/templates/.claude/skills/moai-platform-auth0/examples.md +2446 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/adaptive-mfa.md +233 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/akamai-integration.md +214 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/application-credentials.md +280 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-log-events.md +224 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-overview.md +140 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/bot-detection.md +144 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/breached-password-detection.md +187 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/brute-force-protection.md +189 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/certifications.md +282 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/compliance-overview.md +263 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/continuous-session-protection.md +307 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/customize-mfa.md +177 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/dpop-implementation.md +283 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/fapi-implementation.md +259 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/gdpr-compliance.md +313 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/guardian-configuration.md +269 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/highly-regulated-identity.md +272 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/jwt-fundamentals.md +248 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mdl-verification.md +210 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-api-management.md +278 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-factors.md +226 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-overview.md +174 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mtls-sender-constraining.md +316 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/ropg-flow-mfa.md +216 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-center.md +325 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-guidance.md +277 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/state-parameters.md +177 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/step-up-authentication.md +251 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/suspicious-ip-throttling.md +240 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/tenant-access-control.md +179 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/webauthn-fido.md +235 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/reference.md +224 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +75 -330
- moai_adk/templates/.claude/skills/moai-platform-clerk/examples.md +1426 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/modules/advanced-patterns.md +417 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/reference.md +273 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +100 -340
- moai_adk/templates/.claude/skills/moai-platform-convex/examples.md +506 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/auth-integration.md +421 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/file-storage.md +474 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/reactive-queries.md +302 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/server-functions.md +452 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/reference.md +385 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +113 -326
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/examples.md +514 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/custom-claims.md +374 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/phone-auth.md +372 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/social-auth.md +339 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/reference.md +382 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +71 -302
- moai_adk/templates/.claude/skills/moai-platform-firestore/examples.md +445 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/offline-cache.md +392 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/realtime-listeners.md +441 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/security-rules.md +352 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/transactions.md +452 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/reference.md +322 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +101 -412
- moai_adk/templates/.claude/skills/moai-platform-neon/examples.md +470 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/auto-scaling.md +349 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/branching-workflows.md +354 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/connection-pooling.md +412 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/pitr-backups.md +458 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/reference.md +272 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +96 -327
- moai_adk/templates/.claude/skills/moai-platform-railway/examples.md +539 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/docker-deployment.md +261 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/multi-service.md +291 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/networking-domains.md +338 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/volumes-storage.md +353 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/reference.md +374 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +103 -428
- moai_adk/templates/.claude/skills/moai-platform-supabase/examples.md +502 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/auth-integration.md +384 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/edge-functions.md +371 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/postgresql-pgvector.md +231 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/realtime-presence.md +354 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/row-level-security.md +286 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/storage-cdn.md +319 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/typescript-patterns.md +453 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/reference.md +284 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +96 -446
- moai_adk/templates/.claude/skills/moai-platform-vercel/examples.md +502 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/analytics-speed.md +348 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/deployment-config.md +344 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/edge-functions.md +222 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/isr-caching.md +306 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/kv-storage.md +399 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/reference.md +360 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/SKILL.md +193 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/examples.md +1099 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/language-specific.md +307 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/pattern-syntax.md +237 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/refactoring-patterns.md +260 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/security-rules.md +239 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/reference.md +288 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/go.yml +90 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/python.yml +101 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/typescript.yml +83 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/complexity-check.yml +94 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/deprecated-apis.yml +84 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/secrets-detection.yml +89 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/sql-injection.yml +45 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/xss-prevention.yml +50 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/sgconfig.yml +54 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +225 -423
- moai_adk/templates/.claude/skills/moai-workflow-loop/SKILL.md +197 -0
- moai_adk/templates/.claude/skills/moai-workflow-loop/examples.md +1063 -0
- moai_adk/templates/.claude/skills/moai-workflow-loop/reference.md +1414 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +211 -314
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +15 -43
- moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +119 -316
- moai_adk/templates/.claude/skills/moai-workflow-spec/modules/advanced-patterns.md +237 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +96 -203
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +201 -388
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +52 -3
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +263 -806
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/context7-integration.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/review-workflows.md +500 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/relevance-analysis.md +154 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/safety-analysis.md +148 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/scoring-algorithms.md +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/timeliness-analysis.md +168 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/truthfulness-analysis.md +136 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/usability-analysis.md +153 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework.md +257 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +191 -1344
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/analysis-patterns.md +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/core-classes.md +299 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/tool-integration.md +380 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/debugging-workflows.md +451 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/error-analysis.md +442 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/optimization-patterns.md +473 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/profiling-techniques.md +481 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/ai-optimization.md +241 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/bottleneck-detection.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/optimization-plan.md +315 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/profiler-core.md +277 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/real-time-monitoring.md +187 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +287 -1194
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/quality-metrics.md +415 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/ai-workflows.md +620 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/patterns.md +692 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/security-analysis.md +429 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +262 -1192
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/static-analysis.md +438 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd/core-classes.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/advanced-features.md +494 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/red-green-refactor.md +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-generation.md +471 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-patterns.md +371 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +227 -1222
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/trust5-validation.md +428 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/SKILL.md +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/integration-patterns.md +149 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/moai-adk-integration.md +245 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-advanced.md +310 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-development.md +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-workflows.md +302 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/registry-architecture.md +271 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/resource-optimization.md +300 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/tools-integration.md +280 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/troubleshooting.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-commands.md +296 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-management.md +217 -0
- moai_adk/templates/.git-hooks/pre-push +162 -59
- moai_adk/templates/.github/workflows/ci-universal.yml +934 -133
- moai_adk/templates/.gitignore +65 -107
- moai_adk/templates/.lsp.json +152 -0
- moai_adk/templates/.mcp.json +2 -20
- moai_adk/templates/.moai/announcements/en.json +18 -0
- moai_adk/templates/.moai/announcements/ja.json +18 -0
- moai_adk/templates/.moai/announcements/ko.json +18 -0
- moai_adk/templates/.moai/announcements/zh.json +18 -0
- moai_adk/templates/.moai/config/config.yaml +8 -2
- moai_adk/templates/.moai/config/multilingual-triggers.yaml +213 -0
- moai_adk/templates/.moai/config/sections/language.yaml +2 -2
- moai_adk/templates/.moai/config/sections/llm.yaml +41 -0
- moai_adk/templates/.moai/config/sections/pricing.yaml +30 -0
- moai_adk/templates/.moai/config/sections/project.yaml +2 -2
- moai_adk/templates/.moai/config/sections/quality.yaml +43 -5
- moai_adk/templates/.moai/config/sections/ralph.yaml +55 -0
- moai_adk/templates/.moai/config/sections/system.yaml +46 -1
- moai_adk/templates/.moai/config/sections/user.yaml +1 -1
- moai_adk/templates/.moai/config/statusline-config.yaml +2 -2
- moai_adk/templates/.moai/llm-configs/glm.json +22 -0
- moai_adk/templates/CLAUDE.ja.md +343 -0
- moai_adk/templates/CLAUDE.ko.md +343 -0
- moai_adk/templates/CLAUDE.md +200 -499
- moai_adk/templates/CLAUDE.zh.md +343 -0
- moai_adk/utils/common.py +37 -0
- moai_adk/version.py +1 -1
- moai_adk-1.1.0.dist-info/METADATA +2443 -0
- moai_adk-1.1.0.dist-info/RECORD +701 -0
- {moai_adk-0.34.0.dist-info → moai_adk-1.1.0.dist-info}/entry_points.txt +2 -0
- moai_adk-1.1.0.dist-info/licenses/LICENSE +99 -0
- moai_adk/core/config/auto_spec_config.py +0 -340
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +0 -901
- moai_adk/core/spec/confidence_scoring.py +0 -680
- moai_adk/core/spec/ears_template_engine.py +0 -1247
- moai_adk/core/spec/quality_validator.py +0 -687
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +0 -670
- moai_adk/templates/.claude/agents/moai/expert-database.md +0 -777
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +0 -1041
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +0 -458
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +0 -1607
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +0 -789
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +0 -469
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +0 -1032
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +0 -438
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +0 -431
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +0 -405
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +0 -336
- moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +0 -402
- moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +0 -607
- moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +0 -300
- moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +0 -537
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +0 -520
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +0 -574
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +0 -317
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +0 -663
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +0 -190
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +0 -175
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +0 -196
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +0 -17
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +0 -158
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +0 -340
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +0 -713
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +0 -538
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +0 -1336
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +0 -730
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +0 -608
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +0 -1005
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +0 -436
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +0 -411
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +0 -982
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +0 -778
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +0 -646
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +0 -782
- moai_adk/templates/.moai/config/questions/_schema.yaml +0 -151
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +0 -251
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +0 -108
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +0 -81
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +0 -634
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +0 -170
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +0 -87
- moai_adk/templates/.moai/scripts/setup-glm.py +0 -136
- moai_adk-0.34.0.dist-info/METADATA +0 -2999
- moai_adk-0.34.0.dist-info/RECORD +0 -463
- moai_adk-0.34.0.dist-info/licenses/LICENSE +0 -21
- /moai_adk/foundation/{git.py → git/__init__.py} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-mermaid/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-mermaid/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-nextra/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-jit-docs/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-jit-docs/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-testing/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-testing/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/{moai-worktree → moai-workflow-worktree}/examples.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-worktree → moai-workflow-worktree}/reference.md +0 -0
- {moai_adk-0.34.0.dist-info → moai_adk-1.1.0.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,1323 @@
|
|
|
1
|
+
# PHP 8.3+ and Laravel 11 Complete Reference
|
|
2
|
+
|
|
3
|
+
## PHP 8.3 Feature Matrix
|
|
4
|
+
|
|
5
|
+
| Feature | Status | Production Ready | Description |
|
|
6
|
+
| --------------------- | ------ | ---------------- | ---------------------------------------- |
|
|
7
|
+
| Readonly Classes | Stable | Yes | Immutable classes with readonly modifier |
|
|
8
|
+
| Typed Properties | Stable | Yes | Strong typing for class properties |
|
|
9
|
+
| Constructor Promotion | Stable | Yes | Shorthand property declaration |
|
|
10
|
+
| Attributes | Stable | Yes | Native metadata annotations |
|
|
11
|
+
| Enums | Stable | Yes | First-class enumeration support |
|
|
12
|
+
| Named Arguments | Stable | Yes | Function calls with named parameters |
|
|
13
|
+
| Match Expression | Stable | Yes | Enhanced switch-case statements |
|
|
14
|
+
| Nullsafe Operator | Stable | Yes | Safe property/method access with ?-> |
|
|
15
|
+
| Union Types | Stable | Yes | Multiple type declarations (string\|int) |
|
|
16
|
+
| Intersection Types | Stable | Yes | Combined type requirements (A&B) |
|
|
17
|
+
| Never Type | Stable | Yes | Functions that never return |
|
|
18
|
+
| Fibers | Stable | Yes | Lightweight concurrency primitives |
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## PHP 8.3 Modern Features
|
|
23
|
+
|
|
24
|
+
### Readonly Classes
|
|
25
|
+
|
|
26
|
+
```php
|
|
27
|
+
<?php
|
|
28
|
+
|
|
29
|
+
// Readonly class - all properties are readonly
|
|
30
|
+
readonly class Point
|
|
31
|
+
{
|
|
32
|
+
public function __construct(
|
|
33
|
+
public float $x,
|
|
34
|
+
public float $y,
|
|
35
|
+
) {}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Usage
|
|
39
|
+
$point = new Point(10.5, 20.3);
|
|
40
|
+
// $point->x = 15; // Error: Cannot modify readonly property
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Typed Properties
|
|
44
|
+
|
|
45
|
+
```php
|
|
46
|
+
<?php
|
|
47
|
+
|
|
48
|
+
class User
|
|
49
|
+
{
|
|
50
|
+
public int $id;
|
|
51
|
+
public string $name;
|
|
52
|
+
public ?string $email = null;
|
|
53
|
+
public array $roles = [];
|
|
54
|
+
private \DateTimeImmutable $createdAt;
|
|
55
|
+
|
|
56
|
+
public function __construct(int $id, string $name)
|
|
57
|
+
{
|
|
58
|
+
$this->id = $id;
|
|
59
|
+
$this->name = $name;
|
|
60
|
+
$this->createdAt = new \DateTimeImmutable();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Constructor Property Promotion
|
|
66
|
+
|
|
67
|
+
```php
|
|
68
|
+
<?php
|
|
69
|
+
|
|
70
|
+
// Traditional approach
|
|
71
|
+
class OldUser
|
|
72
|
+
{
|
|
73
|
+
private string $name;
|
|
74
|
+
private string $email;
|
|
75
|
+
|
|
76
|
+
public function __construct(string $name, string $email)
|
|
77
|
+
{
|
|
78
|
+
$this->name = $name;
|
|
79
|
+
$this->email = $email;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Modern approach with property promotion
|
|
84
|
+
class ModernUser
|
|
85
|
+
{
|
|
86
|
+
public function __construct(
|
|
87
|
+
private string $name,
|
|
88
|
+
private string $email,
|
|
89
|
+
) {}
|
|
90
|
+
|
|
91
|
+
public function getName(): string
|
|
92
|
+
{
|
|
93
|
+
return $this->name;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Attributes (Annotations)
|
|
99
|
+
|
|
100
|
+
```php
|
|
101
|
+
<?php
|
|
102
|
+
|
|
103
|
+
#[Attribute(Attribute::TARGET_CLASS)]
|
|
104
|
+
class Table
|
|
105
|
+
{
|
|
106
|
+
public function __construct(
|
|
107
|
+
public string $name,
|
|
108
|
+
) {}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
#[Attribute(Attribute::TARGET_PROPERTY)]
|
|
112
|
+
class Column
|
|
113
|
+
{
|
|
114
|
+
public function __construct(
|
|
115
|
+
public string $name,
|
|
116
|
+
public string $type = 'string',
|
|
117
|
+
public bool $nullable = false,
|
|
118
|
+
) {}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
#[Table('users')]
|
|
122
|
+
class User
|
|
123
|
+
{
|
|
124
|
+
#[Column('id', 'integer')]
|
|
125
|
+
public int $id;
|
|
126
|
+
|
|
127
|
+
#[Column('email', 'string')]
|
|
128
|
+
public string $email;
|
|
129
|
+
|
|
130
|
+
#[Column('created_at', 'datetime', nullable: true)]
|
|
131
|
+
public ?\DateTimeImmutable $createdAt;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Reading attributes
|
|
135
|
+
$reflection = new ReflectionClass(User::class);
|
|
136
|
+
$attributes = $reflection->getAttributes(Table::class);
|
|
137
|
+
foreach ($attributes as $attribute) {
|
|
138
|
+
$table = $attribute->newInstance();
|
|
139
|
+
echo $table->name; // 'users'
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Advanced Enums
|
|
144
|
+
|
|
145
|
+
```php
|
|
146
|
+
<?php
|
|
147
|
+
|
|
148
|
+
// Basic enum
|
|
149
|
+
enum Status: string
|
|
150
|
+
{
|
|
151
|
+
case Pending = 'pending';
|
|
152
|
+
case Approved = 'approved';
|
|
153
|
+
case Rejected = 'rejected';
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Enum with methods and static methods
|
|
157
|
+
enum OrderStatus: string
|
|
158
|
+
{
|
|
159
|
+
case Pending = 'pending';
|
|
160
|
+
case Processing = 'processing';
|
|
161
|
+
case Shipped = 'shipped';
|
|
162
|
+
case Delivered = 'delivered';
|
|
163
|
+
case Cancelled = 'cancelled';
|
|
164
|
+
|
|
165
|
+
public function label(): string
|
|
166
|
+
{
|
|
167
|
+
return match($this) {
|
|
168
|
+
self::Pending => 'Pending',
|
|
169
|
+
self::Processing => 'Processing',
|
|
170
|
+
self::Shipped => 'Shipped',
|
|
171
|
+
self::Delivered => 'Delivered',
|
|
172
|
+
self::Cancelled => 'Cancelled',
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
public function color(): string
|
|
177
|
+
{
|
|
178
|
+
return match($this) {
|
|
179
|
+
self::Pending => 'yellow',
|
|
180
|
+
self::Processing => 'blue',
|
|
181
|
+
self::Shipped => 'purple',
|
|
182
|
+
self::Delivered => 'green',
|
|
183
|
+
self::Cancelled => 'red',
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
public function canTransitionTo(self $newStatus): bool
|
|
188
|
+
{
|
|
189
|
+
return match($this) {
|
|
190
|
+
self::Pending => in_array($newStatus, [self::Processing, self::Cancelled]),
|
|
191
|
+
self::Processing => in_array($newStatus, [self::Shipped, self::Cancelled]),
|
|
192
|
+
self::Shipped => $newStatus === self::Delivered,
|
|
193
|
+
self::Delivered, self::Cancelled => false,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
public static function activeStatuses(): array
|
|
198
|
+
{
|
|
199
|
+
return [self::Pending, self::Processing, self::Shipped];
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
public static function fromString(string $value): self
|
|
203
|
+
{
|
|
204
|
+
return self::from(strtolower($value));
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Match Expression
|
|
210
|
+
|
|
211
|
+
```php
|
|
212
|
+
<?php
|
|
213
|
+
|
|
214
|
+
// Traditional switch
|
|
215
|
+
function getLegacyPrice(string $type): int
|
|
216
|
+
{
|
|
217
|
+
switch ($type) {
|
|
218
|
+
case 'basic':
|
|
219
|
+
return 100;
|
|
220
|
+
case 'premium':
|
|
221
|
+
return 200;
|
|
222
|
+
case 'enterprise':
|
|
223
|
+
return 500;
|
|
224
|
+
default:
|
|
225
|
+
throw new InvalidArgumentException('Invalid type');
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Modern match expression
|
|
230
|
+
function getPrice(string $type): int
|
|
231
|
+
{
|
|
232
|
+
return match($type) {
|
|
233
|
+
'basic' => 100,
|
|
234
|
+
'premium' => 200,
|
|
235
|
+
'enterprise' => 500,
|
|
236
|
+
default => throw new InvalidArgumentException('Invalid type'),
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Match with multiple conditions
|
|
241
|
+
function getDiscount(string $type, int $quantity): float
|
|
242
|
+
{
|
|
243
|
+
return match(true) {
|
|
244
|
+
$quantity >= 100 => 0.3,
|
|
245
|
+
$quantity >= 50 => 0.2,
|
|
246
|
+
$quantity >= 10 => 0.1,
|
|
247
|
+
$type === 'premium' => 0.05,
|
|
248
|
+
default => 0.0,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### Nullsafe Operator
|
|
254
|
+
|
|
255
|
+
```php
|
|
256
|
+
<?php
|
|
257
|
+
|
|
258
|
+
class Address
|
|
259
|
+
{
|
|
260
|
+
public function __construct(
|
|
261
|
+
public ?string $street = null,
|
|
262
|
+
) {}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
class User
|
|
266
|
+
{
|
|
267
|
+
public function __construct(
|
|
268
|
+
public ?Address $address = null,
|
|
269
|
+
) {}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// Traditional approach
|
|
273
|
+
$street = null;
|
|
274
|
+
if ($user !== null) {
|
|
275
|
+
if ($user->address !== null) {
|
|
276
|
+
$street = $user->address->street;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// Nullsafe operator
|
|
281
|
+
$street = $user?->address?->street;
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### Union and Intersection Types
|
|
285
|
+
|
|
286
|
+
```php
|
|
287
|
+
<?php
|
|
288
|
+
|
|
289
|
+
// Union types
|
|
290
|
+
function processId(int|string $id): string
|
|
291
|
+
{
|
|
292
|
+
return is_int($id) ? "ID-{$id}" : $id;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// Multiple union types
|
|
296
|
+
function formatValue(int|float|string|null $value): string
|
|
297
|
+
{
|
|
298
|
+
return match(true) {
|
|
299
|
+
is_null($value) => 'N/A',
|
|
300
|
+
is_int($value) || is_float($value) => number_format($value, 2),
|
|
301
|
+
default => (string) $value,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// Intersection types
|
|
306
|
+
interface Loggable
|
|
307
|
+
{
|
|
308
|
+
public function log(): void;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
interface Serializable
|
|
312
|
+
{
|
|
313
|
+
public function serialize(): string;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
function process(Loggable&Serializable $object): void
|
|
317
|
+
{
|
|
318
|
+
$object->log();
|
|
319
|
+
$data = $object->serialize();
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### Never Type
|
|
324
|
+
|
|
325
|
+
```php
|
|
326
|
+
<?php
|
|
327
|
+
|
|
328
|
+
function redirect(string $url): never
|
|
329
|
+
{
|
|
330
|
+
header("Location: {$url}");
|
|
331
|
+
exit;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
function abort(int $code, string $message): never
|
|
335
|
+
{
|
|
336
|
+
http_response_code($code);
|
|
337
|
+
echo json_encode(['error' => $message]);
|
|
338
|
+
exit;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
function handleError(\Throwable $e): never
|
|
342
|
+
{
|
|
343
|
+
logger()->error($e->getMessage());
|
|
344
|
+
throw $e;
|
|
345
|
+
}
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## Laravel 11 Complete Reference
|
|
351
|
+
|
|
352
|
+
### Application Structure
|
|
353
|
+
|
|
354
|
+
```
|
|
355
|
+
laravel-11-app/
|
|
356
|
+
├── app/
|
|
357
|
+
│ ├── Console/
|
|
358
|
+
│ │ ├── Commands/ # Custom Artisan commands
|
|
359
|
+
│ │ └── Kernel.php # Console kernel
|
|
360
|
+
│ ├── Events/ # Event classes
|
|
361
|
+
│ ├── Exceptions/ # Exception handlers
|
|
362
|
+
│ │ └── Handler.php
|
|
363
|
+
│ ├── Http/
|
|
364
|
+
│ │ ├── Controllers/ # HTTP controllers
|
|
365
|
+
│ │ ├── Middleware/ # HTTP middleware
|
|
366
|
+
│ │ ├── Requests/ # Form request validation
|
|
367
|
+
│ │ └── Resources/ # API resource transformers
|
|
368
|
+
│ ├── Jobs/ # Queue jobs
|
|
369
|
+
│ ├── Listeners/ # Event listeners
|
|
370
|
+
│ ├── Mail/ # Mail classes
|
|
371
|
+
│ ├── Models/ # Eloquent models
|
|
372
|
+
│ ├── Notifications/ # Notification classes
|
|
373
|
+
│ ├── Policies/ # Authorization policies
|
|
374
|
+
│ ├── Providers/ # Service providers
|
|
375
|
+
│ │ ├── AppServiceProvider.php
|
|
376
|
+
│ │ └── RouteServiceProvider.php
|
|
377
|
+
│ └── Services/ # Business logic services
|
|
378
|
+
├── bootstrap/
|
|
379
|
+
│ ├── app.php # Application bootstrap
|
|
380
|
+
│ └── cache/ # Framework cache
|
|
381
|
+
├── config/ # Configuration files
|
|
382
|
+
│ ├── app.php
|
|
383
|
+
│ ├── database.php
|
|
384
|
+
│ ├── queue.php
|
|
385
|
+
│ └── ...
|
|
386
|
+
├── database/
|
|
387
|
+
│ ├── factories/ # Model factories
|
|
388
|
+
│ ├── migrations/ # Database migrations
|
|
389
|
+
│ └── seeders/ # Database seeders
|
|
390
|
+
├── public/ # Public web root
|
|
391
|
+
│ └── index.php
|
|
392
|
+
├── resources/
|
|
393
|
+
│ ├── css/ # CSS assets
|
|
394
|
+
│ ├── js/ # JavaScript assets
|
|
395
|
+
│ └── views/ # Blade templates
|
|
396
|
+
├── routes/
|
|
397
|
+
│ ├── api.php # API routes
|
|
398
|
+
│ ├── channels.php # Broadcast channels
|
|
399
|
+
│ ├── console.php # Console commands
|
|
400
|
+
│ └── web.php # Web routes
|
|
401
|
+
├── storage/
|
|
402
|
+
│ ├── app/ # Application storage
|
|
403
|
+
│ ├── framework/ # Framework files
|
|
404
|
+
│ └── logs/ # Application logs
|
|
405
|
+
├── tests/
|
|
406
|
+
│ ├── Feature/ # Feature tests
|
|
407
|
+
│ └── Unit/ # Unit tests
|
|
408
|
+
├── artisan # Artisan CLI
|
|
409
|
+
├── composer.json # PHP dependencies
|
|
410
|
+
└── phpunit.xml # PHPUnit configuration
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
### Laravel 11 Eloquent ORM Reference
|
|
414
|
+
|
|
415
|
+
#### Model Definitions
|
|
416
|
+
|
|
417
|
+
```php
|
|
418
|
+
<?php
|
|
419
|
+
|
|
420
|
+
namespace App\Models;
|
|
421
|
+
|
|
422
|
+
use Illuminate\Database\Eloquent\Model;
|
|
423
|
+
use Illuminate\Database\Eloquent\SoftDeletes;
|
|
424
|
+
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|
425
|
+
|
|
426
|
+
class Product extends Model
|
|
427
|
+
{
|
|
428
|
+
use HasFactory, SoftDeletes;
|
|
429
|
+
|
|
430
|
+
// Table name (optional if following convention)
|
|
431
|
+
protected $table = 'products';
|
|
432
|
+
|
|
433
|
+
// Primary key (optional if 'id')
|
|
434
|
+
protected $primaryKey = 'id';
|
|
435
|
+
|
|
436
|
+
// Key type
|
|
437
|
+
protected $keyType = 'int';
|
|
438
|
+
|
|
439
|
+
// Auto-incrementing
|
|
440
|
+
public $incrementing = true;
|
|
441
|
+
|
|
442
|
+
// Timestamps
|
|
443
|
+
public $timestamps = true;
|
|
444
|
+
|
|
445
|
+
// Date format
|
|
446
|
+
protected $dateFormat = 'Y-m-d H:i:s';
|
|
447
|
+
|
|
448
|
+
// Connection name
|
|
449
|
+
protected $connection = 'mysql';
|
|
450
|
+
|
|
451
|
+
// Mass assignable attributes
|
|
452
|
+
protected $fillable = [
|
|
453
|
+
'name',
|
|
454
|
+
'description',
|
|
455
|
+
'price',
|
|
456
|
+
'category_id',
|
|
457
|
+
];
|
|
458
|
+
|
|
459
|
+
// Guarded attributes (opposite of fillable)
|
|
460
|
+
protected $guarded = [
|
|
461
|
+
'id',
|
|
462
|
+
'created_at',
|
|
463
|
+
'updated_at',
|
|
464
|
+
];
|
|
465
|
+
|
|
466
|
+
// Hidden attributes (for JSON serialization)
|
|
467
|
+
protected $hidden = [
|
|
468
|
+
'deleted_at',
|
|
469
|
+
];
|
|
470
|
+
|
|
471
|
+
// Visible attributes (for JSON serialization)
|
|
472
|
+
protected $visible = [
|
|
473
|
+
'id',
|
|
474
|
+
'name',
|
|
475
|
+
'price',
|
|
476
|
+
];
|
|
477
|
+
|
|
478
|
+
// Append accessors to JSON
|
|
479
|
+
protected $appends = [
|
|
480
|
+
'formatted_price',
|
|
481
|
+
];
|
|
482
|
+
|
|
483
|
+
// Attribute casting
|
|
484
|
+
protected function casts(): array
|
|
485
|
+
{
|
|
486
|
+
return [
|
|
487
|
+
'price' => 'decimal:2',
|
|
488
|
+
'is_available' => 'boolean',
|
|
489
|
+
'metadata' => 'array',
|
|
490
|
+
'published_at' => 'datetime',
|
|
491
|
+
];
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
#### Eloquent Relationships
|
|
497
|
+
|
|
498
|
+
```php
|
|
499
|
+
<?php
|
|
500
|
+
|
|
501
|
+
namespace App\Models;
|
|
502
|
+
|
|
503
|
+
use Illuminate\Database\Eloquent\Model;
|
|
504
|
+
use Illuminate\Database\Eloquent\Relations\HasMany;
|
|
505
|
+
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
|
506
|
+
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
|
507
|
+
use Illuminate\Database\Eloquent\Relations\HasOne;
|
|
508
|
+
use Illuminate\Database\Eloquent\Relations\HasOneThrough;
|
|
509
|
+
use Illuminate\Database\Eloquent\Relations\HasManyThrough;
|
|
510
|
+
use Illuminate\Database\Eloquent\Relations\MorphTo;
|
|
511
|
+
use Illuminate\Database\Eloquent\Relations\MorphMany;
|
|
512
|
+
use Illuminate\Database\Eloquent\Relations\MorphToMany;
|
|
513
|
+
|
|
514
|
+
class User extends Model
|
|
515
|
+
{
|
|
516
|
+
// One-to-One
|
|
517
|
+
public function profile(): HasOne
|
|
518
|
+
{
|
|
519
|
+
return $this->hasOne(Profile::class);
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
// One-to-Many
|
|
523
|
+
public function posts(): HasMany
|
|
524
|
+
{
|
|
525
|
+
return $this->hasMany(Post::class);
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
// Inverse of One-to-Many (Many-to-One)
|
|
529
|
+
public function company(): BelongsTo
|
|
530
|
+
{
|
|
531
|
+
return $this->belongsTo(Company::class);
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
// Many-to-Many
|
|
535
|
+
public function roles(): BelongsToMany
|
|
536
|
+
{
|
|
537
|
+
return $this->belongsToMany(Role::class)
|
|
538
|
+
->withPivot('assigned_at', 'assigned_by')
|
|
539
|
+
->withTimestamps()
|
|
540
|
+
->using(RoleUser::class); // Custom pivot model
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
// Has One Through
|
|
544
|
+
public function latestPost(): HasOneThrough
|
|
545
|
+
{
|
|
546
|
+
return $this->hasOneThrough(
|
|
547
|
+
Post::class,
|
|
548
|
+
Author::class,
|
|
549
|
+
'user_id', // Foreign key on authors table
|
|
550
|
+
'author_id', // Foreign key on posts table
|
|
551
|
+
'id', // Local key on users table
|
|
552
|
+
'id' // Local key on authors table
|
|
553
|
+
)->latest();
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
// Has Many Through
|
|
557
|
+
public function comments(): HasManyThrough
|
|
558
|
+
{
|
|
559
|
+
return $this->hasManyThrough(
|
|
560
|
+
Comment::class,
|
|
561
|
+
Post::class,
|
|
562
|
+
'user_id', // Foreign key on posts table
|
|
563
|
+
'post_id', // Foreign key on comments table
|
|
564
|
+
'id', // Local key on users table
|
|
565
|
+
'id' // Local key on posts table
|
|
566
|
+
);
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
// Polymorphic Relationship
|
|
570
|
+
public function images(): MorphMany
|
|
571
|
+
{
|
|
572
|
+
return $this->morphMany(Image::class, 'imageable');
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
// Polymorphic Many-to-Many
|
|
576
|
+
public function tags(): MorphToMany
|
|
577
|
+
{
|
|
578
|
+
return $this->morphToMany(Tag::class, 'taggable');
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
class Image extends Model
|
|
583
|
+
{
|
|
584
|
+
// Inverse of Polymorphic
|
|
585
|
+
public function imageable(): MorphTo
|
|
586
|
+
{
|
|
587
|
+
return $this->morphTo();
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
#### Query Scopes
|
|
593
|
+
|
|
594
|
+
```php
|
|
595
|
+
<?php
|
|
596
|
+
|
|
597
|
+
namespace App\Models;
|
|
598
|
+
|
|
599
|
+
use Illuminate\Database\Eloquent\Model;
|
|
600
|
+
use Illuminate\Database\Eloquent\Builder;
|
|
601
|
+
|
|
602
|
+
class Post extends Model
|
|
603
|
+
{
|
|
604
|
+
// Local scope
|
|
605
|
+
public function scopePublished(Builder $query): void
|
|
606
|
+
{
|
|
607
|
+
$query->where('status', 'published')
|
|
608
|
+
->whereNotNull('published_at')
|
|
609
|
+
->where('published_at', '<=', now());
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
// Local scope with parameters
|
|
613
|
+
public function scopeOfType(Builder $query, string $type): void
|
|
614
|
+
{
|
|
615
|
+
$query->where('type', $type);
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
// Chainable scopes
|
|
619
|
+
public function scopeRecent(Builder $query, int $days = 7): void
|
|
620
|
+
{
|
|
621
|
+
$query->where('created_at', '>=', now()->subDays($days));
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
// Global scope (in model boot method)
|
|
625
|
+
protected static function booted(): void
|
|
626
|
+
{
|
|
627
|
+
static::addGlobalScope('active', function (Builder $builder) {
|
|
628
|
+
$builder->where('is_active', true);
|
|
629
|
+
});
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
// Usage
|
|
634
|
+
Post::published()->recent(30)->get();
|
|
635
|
+
Post::ofType('article')->published()->get();
|
|
636
|
+
Post::withoutGlobalScope('active')->get();
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
#### Eloquent Accessors & Mutators
|
|
640
|
+
|
|
641
|
+
```php
|
|
642
|
+
<?php
|
|
643
|
+
|
|
644
|
+
namespace App\Models;
|
|
645
|
+
|
|
646
|
+
use Illuminate\Database\Eloquent\Casts\Attribute;
|
|
647
|
+
use Illuminate\Database\Eloquent\Model;
|
|
648
|
+
|
|
649
|
+
class User extends Model
|
|
650
|
+
{
|
|
651
|
+
// Modern accessor (Laravel 9+)
|
|
652
|
+
protected function firstName(): Attribute
|
|
653
|
+
{
|
|
654
|
+
return Attribute::make(
|
|
655
|
+
get: fn (string $value) => ucfirst($value),
|
|
656
|
+
set: fn (string $value) => strtolower($value),
|
|
657
|
+
);
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
// Computed attribute
|
|
661
|
+
protected function fullName(): Attribute
|
|
662
|
+
{
|
|
663
|
+
return Attribute::make(
|
|
664
|
+
get: fn () => "{$this->first_name} {$this->last_name}",
|
|
665
|
+
);
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
// Legacy accessor
|
|
669
|
+
public function getEmailAttribute($value): string
|
|
670
|
+
{
|
|
671
|
+
return strtolower($value);
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
// Legacy mutator
|
|
675
|
+
public function setPasswordAttribute($value): void
|
|
676
|
+
{
|
|
677
|
+
$this->attributes['password'] = bcrypt($value);
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
```
|
|
681
|
+
|
|
682
|
+
#### Eloquent Events
|
|
683
|
+
|
|
684
|
+
```php
|
|
685
|
+
<?php
|
|
686
|
+
|
|
687
|
+
namespace App\Models;
|
|
688
|
+
|
|
689
|
+
use Illuminate\Database\Eloquent\Model;
|
|
690
|
+
|
|
691
|
+
class User extends Model
|
|
692
|
+
{
|
|
693
|
+
protected static function booted(): void
|
|
694
|
+
{
|
|
695
|
+
// Creating event (before save)
|
|
696
|
+
static::creating(function (User $user) {
|
|
697
|
+
$user->uuid = \Illuminate\Support\Str::uuid();
|
|
698
|
+
});
|
|
699
|
+
|
|
700
|
+
// Created event (after save)
|
|
701
|
+
static::created(function (User $user) {
|
|
702
|
+
$user->profile()->create(['bio' => '']);
|
|
703
|
+
});
|
|
704
|
+
|
|
705
|
+
// Updating event
|
|
706
|
+
static::updating(function (User $user) {
|
|
707
|
+
if ($user->isDirty('email')) {
|
|
708
|
+
$user->email_verified_at = null;
|
|
709
|
+
}
|
|
710
|
+
});
|
|
711
|
+
|
|
712
|
+
// Updated event
|
|
713
|
+
static::updated(function (User $user) {
|
|
714
|
+
cache()->forget("user.{$user->id}");
|
|
715
|
+
});
|
|
716
|
+
|
|
717
|
+
// Saving event (before creating or updating)
|
|
718
|
+
static::saving(function (User $user) {
|
|
719
|
+
$user->email = strtolower($user->email);
|
|
720
|
+
});
|
|
721
|
+
|
|
722
|
+
// Saved event (after creating or updating)
|
|
723
|
+
static::saved(function (User $user) {
|
|
724
|
+
logger()->info("User {$user->id} saved");
|
|
725
|
+
});
|
|
726
|
+
|
|
727
|
+
// Deleting event
|
|
728
|
+
static::deleting(function (User $user) {
|
|
729
|
+
$user->posts()->delete();
|
|
730
|
+
});
|
|
731
|
+
|
|
732
|
+
// Deleted event
|
|
733
|
+
static::deleted(function (User $user) {
|
|
734
|
+
logger()->info("User {$user->id} deleted");
|
|
735
|
+
});
|
|
736
|
+
|
|
737
|
+
// Restoring event (soft deletes)
|
|
738
|
+
static::restoring(function (User $user) {
|
|
739
|
+
$user->posts()->restore();
|
|
740
|
+
});
|
|
741
|
+
|
|
742
|
+
// Restored event
|
|
743
|
+
static::restored(function (User $user) {
|
|
744
|
+
logger()->info("User {$user->id} restored");
|
|
745
|
+
});
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
```
|
|
749
|
+
|
|
750
|
+
### Laravel Validation Rules Reference
|
|
751
|
+
|
|
752
|
+
```php
|
|
753
|
+
<?php
|
|
754
|
+
|
|
755
|
+
namespace App\Http\Requests;
|
|
756
|
+
|
|
757
|
+
use Illuminate\Foundation\Http\FormRequest;
|
|
758
|
+
use Illuminate\Validation\Rule;
|
|
759
|
+
use Illuminate\Validation\Rules\Password;
|
|
760
|
+
|
|
761
|
+
class ValidationExamplesRequest extends FormRequest
|
|
762
|
+
{
|
|
763
|
+
public function rules(): array
|
|
764
|
+
{
|
|
765
|
+
return [
|
|
766
|
+
// Basic validation
|
|
767
|
+
'name' => 'required|string|max:255',
|
|
768
|
+
'email' => 'required|email|unique:users,email',
|
|
769
|
+
'age' => 'required|integer|min:18|max:100',
|
|
770
|
+
|
|
771
|
+
// Array validation
|
|
772
|
+
'tags' => 'array|min:1|max:5',
|
|
773
|
+
'tags.*' => 'string|max:50',
|
|
774
|
+
|
|
775
|
+
// Nested validation
|
|
776
|
+
'user' => 'required|array',
|
|
777
|
+
'user.name' => 'required|string',
|
|
778
|
+
'user.email' => 'required|email',
|
|
779
|
+
'user.address' => 'array',
|
|
780
|
+
'user.address.street' => 'required_with:user.address|string',
|
|
781
|
+
|
|
782
|
+
// Conditional validation
|
|
783
|
+
'billing_address' => 'required_if:same_as_shipping,false',
|
|
784
|
+
'shipping_method' => 'required_unless:is_digital,true',
|
|
785
|
+
'tracking_number' => 'required_with:shipping_method',
|
|
786
|
+
|
|
787
|
+
// File validation
|
|
788
|
+
'avatar' => 'nullable|image|mimes:jpeg,png,jpg|max:2048',
|
|
789
|
+
'document' => 'required|file|mimes:pdf,doc,docx|max:10240',
|
|
790
|
+
|
|
791
|
+
// Date validation
|
|
792
|
+
'birth_date' => 'required|date|before:today',
|
|
793
|
+
'appointment' => 'required|date|after:tomorrow',
|
|
794
|
+
'expired_at' => 'nullable|date|after_or_equal:start_date',
|
|
795
|
+
|
|
796
|
+
// Password validation
|
|
797
|
+
'password' => [
|
|
798
|
+
'required',
|
|
799
|
+
'confirmed',
|
|
800
|
+
Password::min(8)
|
|
801
|
+
->letters()
|
|
802
|
+
->mixedCase()
|
|
803
|
+
->numbers()
|
|
804
|
+
->symbols()
|
|
805
|
+
->uncompromised(),
|
|
806
|
+
],
|
|
807
|
+
|
|
808
|
+
// Enum validation
|
|
809
|
+
'status' => ['required', Rule::enum(OrderStatus::class)],
|
|
810
|
+
|
|
811
|
+
// Unique with exceptions
|
|
812
|
+
'slug' => [
|
|
813
|
+
'required',
|
|
814
|
+
'string',
|
|
815
|
+
Rule::unique('posts')->ignore($this->post),
|
|
816
|
+
],
|
|
817
|
+
|
|
818
|
+
// In validation
|
|
819
|
+
'role' => ['required', Rule::in(['admin', 'editor', 'viewer'])],
|
|
820
|
+
|
|
821
|
+
// Exists validation
|
|
822
|
+
'category_id' => 'required|exists:categories,id',
|
|
823
|
+
'user_id' => [
|
|
824
|
+
'required',
|
|
825
|
+
Rule::exists('users', 'id')->where('is_active', true),
|
|
826
|
+
],
|
|
827
|
+
|
|
828
|
+
// Custom validation
|
|
829
|
+
'custom_field' => [
|
|
830
|
+
'required',
|
|
831
|
+
function ($attribute, $value, $fail) {
|
|
832
|
+
if (strtoupper($value) !== $value) {
|
|
833
|
+
$fail("The {$attribute} must be uppercase.");
|
|
834
|
+
}
|
|
835
|
+
},
|
|
836
|
+
],
|
|
837
|
+
|
|
838
|
+
// Sometimes validation
|
|
839
|
+
'optional_field' => 'sometimes|required|string',
|
|
840
|
+
|
|
841
|
+
// Nullable vs Required
|
|
842
|
+
'middle_name' => 'nullable|string|max:100',
|
|
843
|
+
|
|
844
|
+
// Boolean validation
|
|
845
|
+
'is_active' => 'required|boolean',
|
|
846
|
+
'accepted_terms' => 'accepted',
|
|
847
|
+
|
|
848
|
+
// Numeric validation
|
|
849
|
+
'price' => 'required|numeric|min:0|max:99999.99',
|
|
850
|
+
'quantity' => 'required|integer|between:1,1000',
|
|
851
|
+
|
|
852
|
+
// String validation
|
|
853
|
+
'username' => 'required|string|alpha_dash|min:3|max:20',
|
|
854
|
+
'code' => 'required|string|alpha_num|size:6',
|
|
855
|
+
|
|
856
|
+
// URL validation
|
|
857
|
+
'website' => 'nullable|url|active_url',
|
|
858
|
+
|
|
859
|
+
// JSON validation
|
|
860
|
+
'metadata' => 'nullable|json',
|
|
861
|
+
|
|
862
|
+
// IP validation
|
|
863
|
+
'ip_address' => 'nullable|ip',
|
|
864
|
+
'ipv4_address' => 'nullable|ipv4',
|
|
865
|
+
|
|
866
|
+
// Regex validation
|
|
867
|
+
'phone' => 'required|regex:/^([0-9\s\-\+\(\)]*)$/',
|
|
868
|
+
|
|
869
|
+
// Multiple of validation
|
|
870
|
+
'quantity' => 'required|integer|multiple_of:5',
|
|
871
|
+
];
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
```
|
|
875
|
+
|
|
876
|
+
### Artisan Commands Reference
|
|
877
|
+
|
|
878
|
+
```bash
|
|
879
|
+
# Application management
|
|
880
|
+
php artisan serve # Start development server
|
|
881
|
+
php artisan tinker # REPL console
|
|
882
|
+
php artisan optimize # Optimize framework
|
|
883
|
+
php artisan optimize:clear # Clear optimization cache
|
|
884
|
+
php artisan about # Display application info
|
|
885
|
+
|
|
886
|
+
# Cache management
|
|
887
|
+
php artisan cache:clear # Clear application cache
|
|
888
|
+
php artisan config:clear # Clear configuration cache
|
|
889
|
+
php artisan route:clear # Clear route cache
|
|
890
|
+
php artisan view:clear # Clear compiled views
|
|
891
|
+
php artisan event:clear # Clear cached events
|
|
892
|
+
|
|
893
|
+
# Cache building
|
|
894
|
+
php artisan config:cache # Cache configuration
|
|
895
|
+
php artisan route:cache # Cache routes
|
|
896
|
+
php artisan view:cache # Compile views
|
|
897
|
+
php artisan event:cache # Cache events
|
|
898
|
+
|
|
899
|
+
# Database
|
|
900
|
+
php artisan migrate # Run migrations
|
|
901
|
+
php artisan migrate:fresh # Drop all tables and re-migrate
|
|
902
|
+
php artisan migrate:refresh # Reset and re-run migrations
|
|
903
|
+
php artisan migrate:reset # Rollback all migrations
|
|
904
|
+
php artisan migrate:rollback # Rollback last migration
|
|
905
|
+
php artisan migrate:status # Show migration status
|
|
906
|
+
php artisan db:seed # Seed database
|
|
907
|
+
php artisan db:wipe # Drop all tables
|
|
908
|
+
|
|
909
|
+
# Model generation
|
|
910
|
+
php artisan make:model User -mfsc # Model with migration, factory, seeder, controller
|
|
911
|
+
php artisan make:model Post --all # Model with all resources
|
|
912
|
+
|
|
913
|
+
# Resource generation
|
|
914
|
+
php artisan make:controller UserController --resource --api
|
|
915
|
+
php artisan make:request StoreUserRequest
|
|
916
|
+
php artisan make:resource UserResource
|
|
917
|
+
php artisan make:migration create_users_table
|
|
918
|
+
php artisan make:seeder UserSeeder
|
|
919
|
+
php artisan make:factory UserFactory
|
|
920
|
+
php artisan make:middleware CheckAge
|
|
921
|
+
php artisan make:policy UserPolicy
|
|
922
|
+
php artisan make:event UserRegistered
|
|
923
|
+
php artisan make:listener SendWelcomeEmail
|
|
924
|
+
php artisan make:job ProcessOrder
|
|
925
|
+
php artisan make:mail WelcomeMail
|
|
926
|
+
php artisan make:notification OrderShipped
|
|
927
|
+
php artisan make:command SendEmails
|
|
928
|
+
php artisan make:rule Uppercase
|
|
929
|
+
php artisan make:provider CustomServiceProvider
|
|
930
|
+
php artisan make:test UserTest --unit
|
|
931
|
+
php artisan make:test UserFeatureTest
|
|
932
|
+
|
|
933
|
+
# Queue management
|
|
934
|
+
php artisan queue:work # Process queue jobs
|
|
935
|
+
php artisan queue:work --queue=high,default
|
|
936
|
+
php artisan queue:listen # Listen for jobs
|
|
937
|
+
php artisan queue:restart # Restart queue workers
|
|
938
|
+
php artisan queue:retry all # Retry failed jobs
|
|
939
|
+
php artisan queue:failed # List failed jobs
|
|
940
|
+
php artisan queue:flush # Delete all failed jobs
|
|
941
|
+
|
|
942
|
+
# Schedule
|
|
943
|
+
php artisan schedule:run # Run scheduled commands
|
|
944
|
+
php artisan schedule:work # Run scheduler in foreground
|
|
945
|
+
php artisan schedule:list # List scheduled commands
|
|
946
|
+
|
|
947
|
+
# Storage
|
|
948
|
+
php artisan storage:link # Create symbolic link to storage
|
|
949
|
+
|
|
950
|
+
# Vendor publishing
|
|
951
|
+
php artisan vendor:publish # Publish vendor assets
|
|
952
|
+
|
|
953
|
+
# Route information
|
|
954
|
+
php artisan route:list # List all routes
|
|
955
|
+
php artisan route:list --except-vendor
|
|
956
|
+
php artisan route:list --path=api
|
|
957
|
+
|
|
958
|
+
# Custom commands
|
|
959
|
+
php artisan inspire # Display inspiring quote
|
|
960
|
+
```
|
|
961
|
+
|
|
962
|
+
### Composer Configuration
|
|
963
|
+
|
|
964
|
+
```json
|
|
965
|
+
{
|
|
966
|
+
"name": "your-org/laravel-app",
|
|
967
|
+
"type": "project",
|
|
968
|
+
"description": "Laravel 11 Application",
|
|
969
|
+
"keywords": ["laravel", "framework"],
|
|
970
|
+
"license": "MIT",
|
|
971
|
+
"require": {
|
|
972
|
+
"php": "^8.3",
|
|
973
|
+
"laravel/framework": "^11.0",
|
|
974
|
+
"laravel/sanctum": "^4.0",
|
|
975
|
+
"laravel/tinker": "^2.9"
|
|
976
|
+
},
|
|
977
|
+
"require-dev": {
|
|
978
|
+
"fakerphp/faker": "^1.23",
|
|
979
|
+
"laravel/pint": "^1.13",
|
|
980
|
+
"laravel/sail": "^1.26",
|
|
981
|
+
"mockery/mockery": "^1.6",
|
|
982
|
+
"nunomaduro/collision": "^8.0",
|
|
983
|
+
"pestphp/pest": "^2.34",
|
|
984
|
+
"pestphp/pest-plugin-laravel": "^2.3",
|
|
985
|
+
"phpstan/phpstan": "^1.10",
|
|
986
|
+
"phpunit/phpunit": "^11.0",
|
|
987
|
+
"spatie/laravel-ignition": "^2.4"
|
|
988
|
+
},
|
|
989
|
+
"autoload": {
|
|
990
|
+
"psr-4": {
|
|
991
|
+
"App\\": "app/",
|
|
992
|
+
"Database\\Factories\\": "database/factories/",
|
|
993
|
+
"Database\\Seeders\\": "database/seeders/"
|
|
994
|
+
}
|
|
995
|
+
},
|
|
996
|
+
"autoload-dev": {
|
|
997
|
+
"psr-4": {
|
|
998
|
+
"Tests\\": "tests/"
|
|
999
|
+
}
|
|
1000
|
+
},
|
|
1001
|
+
"scripts": {
|
|
1002
|
+
"post-autoload-dump": [
|
|
1003
|
+
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
|
|
1004
|
+
"@php artisan package:discover --ansi"
|
|
1005
|
+
],
|
|
1006
|
+
"post-update-cmd": [
|
|
1007
|
+
"@php artisan vendor:publish --tag=laravel-assets --ansi --force"
|
|
1008
|
+
],
|
|
1009
|
+
"post-root-package-install": [
|
|
1010
|
+
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
|
|
1011
|
+
],
|
|
1012
|
+
"post-create-project-cmd": [
|
|
1013
|
+
"@php artisan key:generate --ansi",
|
|
1014
|
+
"@php -r \"file_exists('database/database.sqlite') || touch('database/database.sqlite');\"",
|
|
1015
|
+
"@php artisan migrate --graceful --ansi"
|
|
1016
|
+
],
|
|
1017
|
+
"test": "pest",
|
|
1018
|
+
"test:coverage": "pest --coverage",
|
|
1019
|
+
"pint": "pint",
|
|
1020
|
+
"stan": "phpstan analyse"
|
|
1021
|
+
},
|
|
1022
|
+
"extra": {
|
|
1023
|
+
"laravel": {
|
|
1024
|
+
"dont-discover": []
|
|
1025
|
+
}
|
|
1026
|
+
},
|
|
1027
|
+
"config": {
|
|
1028
|
+
"optimize-autoloader": true,
|
|
1029
|
+
"preferred-install": "dist",
|
|
1030
|
+
"sort-packages": true,
|
|
1031
|
+
"allow-plugins": {
|
|
1032
|
+
"pestphp/pest-plugin": true,
|
|
1033
|
+
"php-http/discovery": true
|
|
1034
|
+
}
|
|
1035
|
+
},
|
|
1036
|
+
"minimum-stability": "stable",
|
|
1037
|
+
"prefer-stable": true
|
|
1038
|
+
}
|
|
1039
|
+
```
|
|
1040
|
+
|
|
1041
|
+
### PHPStan Configuration
|
|
1042
|
+
|
|
1043
|
+
```neon
|
|
1044
|
+
# phpstan.neon
|
|
1045
|
+
includes:
|
|
1046
|
+
- ./vendor/larastan/larastan/extension.neon
|
|
1047
|
+
|
|
1048
|
+
parameters:
|
|
1049
|
+
paths:
|
|
1050
|
+
- app
|
|
1051
|
+
- config
|
|
1052
|
+
- database
|
|
1053
|
+
- routes
|
|
1054
|
+
- tests
|
|
1055
|
+
|
|
1056
|
+
level: 6
|
|
1057
|
+
|
|
1058
|
+
ignoreErrors:
|
|
1059
|
+
- '#Unsafe usage of new static#'
|
|
1060
|
+
|
|
1061
|
+
excludePaths:
|
|
1062
|
+
- ./*/*/FileToBeExcluded.php
|
|
1063
|
+
|
|
1064
|
+
checkMissingIterableValueType: false
|
|
1065
|
+
```
|
|
1066
|
+
|
|
1067
|
+
### Laravel Pint Configuration
|
|
1068
|
+
|
|
1069
|
+
```json
|
|
1070
|
+
{
|
|
1071
|
+
"preset": "laravel",
|
|
1072
|
+
"rules": {
|
|
1073
|
+
"array_syntax": {
|
|
1074
|
+
"syntax": "short"
|
|
1075
|
+
},
|
|
1076
|
+
"binary_operator_spaces": {
|
|
1077
|
+
"default": "single_space"
|
|
1078
|
+
},
|
|
1079
|
+
"blank_line_after_namespace": true,
|
|
1080
|
+
"blank_line_after_opening_tag": true,
|
|
1081
|
+
"blank_line_before_statement": {
|
|
1082
|
+
"statements": ["return"]
|
|
1083
|
+
},
|
|
1084
|
+
"braces": true,
|
|
1085
|
+
"cast_spaces": true,
|
|
1086
|
+
"class_attributes_separation": {
|
|
1087
|
+
"elements": {
|
|
1088
|
+
"method": "one"
|
|
1089
|
+
}
|
|
1090
|
+
},
|
|
1091
|
+
"concat_space": {
|
|
1092
|
+
"spacing": "none"
|
|
1093
|
+
},
|
|
1094
|
+
"declare_equal_normalize": true,
|
|
1095
|
+
"elseif": true,
|
|
1096
|
+
"encoding": true,
|
|
1097
|
+
"full_opening_tag": true,
|
|
1098
|
+
"function_declaration": true,
|
|
1099
|
+
"indentation_type": true,
|
|
1100
|
+
"line_ending": true,
|
|
1101
|
+
"lowercase_cast": true,
|
|
1102
|
+
"lowercase_keywords": true,
|
|
1103
|
+
"method_argument_space": {
|
|
1104
|
+
"on_multiline": "ensure_fully_multiline"
|
|
1105
|
+
},
|
|
1106
|
+
"native_function_casing": true,
|
|
1107
|
+
"no_blank_lines_after_class_opening": true,
|
|
1108
|
+
"no_closing_tag": true,
|
|
1109
|
+
"no_spaces_after_function_name": true,
|
|
1110
|
+
"no_spaces_inside_parenthesis": true,
|
|
1111
|
+
"no_trailing_whitespace": true,
|
|
1112
|
+
"no_trailing_whitespace_in_comment": true,
|
|
1113
|
+
"single_blank_line_at_eof": true,
|
|
1114
|
+
"single_class_element_per_statement": {
|
|
1115
|
+
"elements": ["property"]
|
|
1116
|
+
},
|
|
1117
|
+
"single_import_per_statement": true,
|
|
1118
|
+
"single_line_after_imports": true,
|
|
1119
|
+
"switch_case_semicolon_to_colon": true,
|
|
1120
|
+
"switch_case_space": true,
|
|
1121
|
+
"visibility_required": true,
|
|
1122
|
+
"ordered_imports": {
|
|
1123
|
+
"sort_algorithm": "alpha"
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1127
|
+
```
|
|
1128
|
+
|
|
1129
|
+
### Performance Optimization Tips
|
|
1130
|
+
|
|
1131
|
+
#### Eloquent Performance
|
|
1132
|
+
|
|
1133
|
+
```php
|
|
1134
|
+
<?php
|
|
1135
|
+
|
|
1136
|
+
// Eager loading (N+1 query prevention)
|
|
1137
|
+
$users = User::with('posts', 'profile')->get();
|
|
1138
|
+
$users = User::with(['posts' => function ($query) {
|
|
1139
|
+
$query->where('published', true)->orderBy('created_at', 'desc');
|
|
1140
|
+
}])->get();
|
|
1141
|
+
|
|
1142
|
+
// Lazy eager loading
|
|
1143
|
+
$users = User::all();
|
|
1144
|
+
$users->load('posts');
|
|
1145
|
+
|
|
1146
|
+
// Preventing lazy loading in production
|
|
1147
|
+
Model::preventLazyLoading(!app()->isProduction());
|
|
1148
|
+
|
|
1149
|
+
// Chunk processing for large datasets
|
|
1150
|
+
User::chunk(100, function ($users) {
|
|
1151
|
+
foreach ($users as $user) {
|
|
1152
|
+
// Process user
|
|
1153
|
+
}
|
|
1154
|
+
});
|
|
1155
|
+
|
|
1156
|
+
// Cursor for memory efficiency
|
|
1157
|
+
foreach (User::cursor() as $user) {
|
|
1158
|
+
// Process user
|
|
1159
|
+
}
|
|
1160
|
+
|
|
1161
|
+
// Select specific columns
|
|
1162
|
+
User::select('id', 'name', 'email')->get();
|
|
1163
|
+
|
|
1164
|
+
// Count without loading
|
|
1165
|
+
$count = User::count();
|
|
1166
|
+
$max = User::max('age');
|
|
1167
|
+
$avg = User::avg('score');
|
|
1168
|
+
|
|
1169
|
+
// Exists check
|
|
1170
|
+
if (User::where('email', $email)->exists()) {
|
|
1171
|
+
// User exists
|
|
1172
|
+
}
|
|
1173
|
+
```
|
|
1174
|
+
|
|
1175
|
+
#### Caching Strategies
|
|
1176
|
+
|
|
1177
|
+
```php
|
|
1178
|
+
<?php
|
|
1179
|
+
|
|
1180
|
+
use Illuminate\Support\Facades\Cache;
|
|
1181
|
+
|
|
1182
|
+
// Cache::get with default
|
|
1183
|
+
$value = Cache::get('key', 'default');
|
|
1184
|
+
|
|
1185
|
+
// Cache::remember
|
|
1186
|
+
$users = Cache::remember('users.active', 3600, function () {
|
|
1187
|
+
return User::active()->get();
|
|
1188
|
+
});
|
|
1189
|
+
|
|
1190
|
+
// Cache::rememberForever
|
|
1191
|
+
$settings = Cache::rememberForever('settings', function () {
|
|
1192
|
+
return Setting::all();
|
|
1193
|
+
});
|
|
1194
|
+
|
|
1195
|
+
// Cache::put
|
|
1196
|
+
Cache::put('key', 'value', 3600);
|
|
1197
|
+
Cache::put('key', 'value', now()->addHours(1));
|
|
1198
|
+
|
|
1199
|
+
// Cache::forever
|
|
1200
|
+
Cache::forever('key', 'value');
|
|
1201
|
+
|
|
1202
|
+
// Cache::forget
|
|
1203
|
+
Cache::forget('key');
|
|
1204
|
+
|
|
1205
|
+
// Cache::flush (clear all)
|
|
1206
|
+
Cache::flush();
|
|
1207
|
+
|
|
1208
|
+
// Cache tags (Redis, Memcached only)
|
|
1209
|
+
Cache::tags(['users', 'active'])->put('key', 'value', 3600);
|
|
1210
|
+
$value = Cache::tags(['users'])->get('key');
|
|
1211
|
+
Cache::tags(['users'])->flush();
|
|
1212
|
+
|
|
1213
|
+
// Cache::increment / decrement
|
|
1214
|
+
Cache::increment('views', 1);
|
|
1215
|
+
Cache::decrement('stock', 5);
|
|
1216
|
+
```
|
|
1217
|
+
|
|
1218
|
+
---
|
|
1219
|
+
|
|
1220
|
+
## Context7 Library Integration
|
|
1221
|
+
|
|
1222
|
+
### Available PHP Libraries
|
|
1223
|
+
|
|
1224
|
+
| Library | Context7 ID | Topics |
|
|
1225
|
+
| ----------------- | ------------------------- | ----------------------------------------- |
|
|
1226
|
+
| Laravel Framework | /laravel/framework | eloquent, routing, middleware, validation |
|
|
1227
|
+
| Laravel Sanctum | /laravel/sanctum | API authentication, SPA authentication |
|
|
1228
|
+
| Laravel Horizon | /laravel/horizon | queue monitoring, job metrics |
|
|
1229
|
+
| Symfony | /symfony/symfony | components, bundles, services |
|
|
1230
|
+
| Doctrine ORM | /doctrine/orm | entities, repositories, DQL |
|
|
1231
|
+
| PHPUnit | /phpunit/phpunit | testing, assertions, mocking |
|
|
1232
|
+
| Pest PHP | /pestphp/pest | elegant testing, expectations |
|
|
1233
|
+
| Composer | /composer/composer | dependency management, autoloading |
|
|
1234
|
+
| Guzzle HTTP | /guzzlehttp/guzzle | HTTP client, requests, middleware |
|
|
1235
|
+
| Monolog | /Seldaek/monolog | logging, handlers, formatters |
|
|
1236
|
+
| Carbon | /briannesbitt/carbon | date/time manipulation |
|
|
1237
|
+
| PhpSpreadsheet | /PHPOffice/PhpSpreadsheet | Excel, CSV processing |
|
|
1238
|
+
|
|
1239
|
+
### Usage Example
|
|
1240
|
+
|
|
1241
|
+
```php
|
|
1242
|
+
// Step 1: Resolve library ID
|
|
1243
|
+
$libraryId = mcp__context7__resolve_library_id("laravel/framework");
|
|
1244
|
+
// Returns: /laravel/framework
|
|
1245
|
+
|
|
1246
|
+
// Step 2: Get documentation
|
|
1247
|
+
$docs = mcp__context7__get_library_docs(
|
|
1248
|
+
context7CompatibleLibraryID: "/laravel/framework",
|
|
1249
|
+
topic: "eloquent relationships eager loading",
|
|
1250
|
+
tokens: 5000
|
|
1251
|
+
);
|
|
1252
|
+
```
|
|
1253
|
+
|
|
1254
|
+
---
|
|
1255
|
+
|
|
1256
|
+
## Security Best Practices
|
|
1257
|
+
|
|
1258
|
+
### OWASP Top 10 Prevention
|
|
1259
|
+
|
|
1260
|
+
```php
|
|
1261
|
+
<?php
|
|
1262
|
+
|
|
1263
|
+
// 1. SQL Injection Prevention
|
|
1264
|
+
// ✅ Use query builder or Eloquent
|
|
1265
|
+
User::where('email', $email)->first();
|
|
1266
|
+
|
|
1267
|
+
// ❌ Avoid raw queries with user input
|
|
1268
|
+
// DB::select("SELECT * FROM users WHERE email = '$email'");
|
|
1269
|
+
|
|
1270
|
+
// ✅ If raw query needed, use bindings
|
|
1271
|
+
DB::select('SELECT * FROM users WHERE email = ?', [$email]);
|
|
1272
|
+
|
|
1273
|
+
// 2. XSS Prevention
|
|
1274
|
+
// ✅ Blade auto-escapes
|
|
1275
|
+
{{ $userInput }}
|
|
1276
|
+
|
|
1277
|
+
// ✅ Raw output only for trusted content
|
|
1278
|
+
{!! $trustedHtml !!}
|
|
1279
|
+
|
|
1280
|
+
// 3. CSRF Protection (enabled by default)
|
|
1281
|
+
// ✅ Forms include CSRF token
|
|
1282
|
+
@csrf
|
|
1283
|
+
|
|
1284
|
+
// 4. Mass Assignment Protection
|
|
1285
|
+
// ✅ Use $fillable or $guarded
|
|
1286
|
+
protected $fillable = ['name', 'email'];
|
|
1287
|
+
|
|
1288
|
+
// 5. Authentication & Authorization
|
|
1289
|
+
// ✅ Use Laravel's built-in auth
|
|
1290
|
+
Auth::check()
|
|
1291
|
+
Gate::allows('update', $post)
|
|
1292
|
+
$this->authorize('update', $post)
|
|
1293
|
+
|
|
1294
|
+
// 6. Password Hashing
|
|
1295
|
+
// ✅ Use Hash facade or password cast
|
|
1296
|
+
Hash::make($password)
|
|
1297
|
+
protected $casts = ['password' => 'hashed'];
|
|
1298
|
+
|
|
1299
|
+
// 7. Rate Limiting
|
|
1300
|
+
// ✅ Apply rate limiting middleware
|
|
1301
|
+
Route::middleware('throttle:60,1')->group(function () {
|
|
1302
|
+
Route::get('/api/users', [UserController::class, 'index']);
|
|
1303
|
+
});
|
|
1304
|
+
|
|
1305
|
+
// 8. File Upload Validation
|
|
1306
|
+
// ✅ Validate file types and sizes
|
|
1307
|
+
$request->validate([
|
|
1308
|
+
'file' => 'required|file|mimes:pdf,jpg,png|max:2048',
|
|
1309
|
+
]);
|
|
1310
|
+
|
|
1311
|
+
// 9. Environment Variables
|
|
1312
|
+
// ✅ Never commit .env file
|
|
1313
|
+
// ✅ Use config() helper
|
|
1314
|
+
config('app.key')
|
|
1315
|
+
|
|
1316
|
+
// 10. Secure Headers
|
|
1317
|
+
// ✅ Add security headers middleware
|
|
1318
|
+
```
|
|
1319
|
+
|
|
1320
|
+
---
|
|
1321
|
+
|
|
1322
|
+
Last Updated: 2026-01-10
|
|
1323
|
+
Version: 1.0.0
|