@mytechtoday/augment-extensions 0.5.0 → 1.2.0
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.
- package/AGENTS.md +265 -232
- package/README.md +956 -771
- package/augment-extensions/coding-standards/bash/README.md +196 -196
- package/augment-extensions/coding-standards/bash/module.json +163 -163
- package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -336
- package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -289
- package/augment-extensions/coding-standards/css/README.md +40 -40
- package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -550
- package/augment-extensions/coding-standards/css/module.json +44 -44
- package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -448
- package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -492
- package/augment-extensions/coding-standards/html/README.md +40 -40
- package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -267
- package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -505
- package/augment-extensions/coding-standards/html/module.json +44 -44
- package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -349
- package/augment-extensions/coding-standards/html-css-js/README.md +194 -194
- package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -487
- package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -550
- package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -667
- package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -267
- package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -612
- package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -505
- package/augment-extensions/coding-standards/html-css-js/module.json +48 -48
- package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -515
- package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -448
- package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -492
- package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -439
- package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -349
- package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -486
- package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -463
- package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -543
- package/augment-extensions/coding-standards/js/README.md +46 -46
- package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -487
- package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -667
- package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -612
- package/augment-extensions/coding-standards/js/module.json +49 -49
- package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -515
- package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -439
- package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -486
- package/augment-extensions/coding-standards/js/rules/performance.md +463 -463
- package/augment-extensions/coding-standards/js/rules/tooling.md +543 -543
- package/augment-extensions/coding-standards/php/README.md +248 -248
- package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -204
- package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -206
- package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -234
- package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -211
- package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -215
- package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -189
- package/augment-extensions/coding-standards/php/module.json +166 -166
- package/augment-extensions/coding-standards/php/rules/api-development.md +480 -480
- package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -332
- package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -472
- package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -561
- package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -402
- package/augment-extensions/coding-standards/php/rules/documentation.md +425 -425
- package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -627
- package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -336
- package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -677
- package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -279
- package/augment-extensions/coding-standards/php/rules/performance.md +392 -392
- package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -186
- package/augment-extensions/coding-standards/php/rules/security.md +358 -358
- package/augment-extensions/coding-standards/php/rules/testing.md +403 -403
- package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -331
- package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -426
- package/augment-extensions/coding-standards/powershell/README.md +154 -154
- package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -272
- package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -173
- package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -243
- package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -297
- package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -224
- package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -340
- package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -255
- package/augment-extensions/coding-standards/powershell/module.json +165 -165
- package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -439
- package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -240
- package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -384
- package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -383
- package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -482
- package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -296
- package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -314
- package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -466
- package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -244
- package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -266
- package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -209
- package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -314
- package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -268
- package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -197
- package/augment-extensions/coding-standards/python/README.md +48 -48
- package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -373
- package/augment-extensions/coding-standards/python/module.json +30 -30
- package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -884
- package/augment-extensions/coding-standards/python/rules/best-practices.md +232 -232
- package/augment-extensions/coding-standards/python/rules/code-organization.md +220 -220
- package/augment-extensions/coding-standards/python/rules/documentation.md +831 -831
- package/augment-extensions/coding-standards/python/rules/error-handling.md +1008 -1008
- package/augment-extensions/coding-standards/python/rules/naming-conventions.md +172 -172
- package/augment-extensions/coding-standards/python/rules/testing.md +409 -409
- package/augment-extensions/coding-standards/python/rules/tooling.md +446 -446
- package/augment-extensions/coding-standards/python/rules/type-hints.md +253 -253
- package/augment-extensions/coding-standards/react/README.md +45 -45
- package/augment-extensions/coding-standards/react/module.json +27 -27
- package/augment-extensions/coding-standards/react/rules/component-patterns.md +214 -214
- package/augment-extensions/coding-standards/react/rules/hooks-best-practices.md +235 -235
- package/augment-extensions/coding-standards/react/rules/performance.md +300 -300
- package/augment-extensions/coding-standards/react/rules/state-management.md +265 -265
- package/augment-extensions/coding-standards/react/rules/typescript-react.md +271 -271
- package/augment-extensions/coding-standards/typescript/README.md +45 -45
- package/augment-extensions/coding-standards/typescript/module.json +27 -27
- package/augment-extensions/coding-standards/typescript/rules/naming-conventions.md +225 -225
- package/augment-extensions/collections/html-css-js/README.md +82 -82
- package/augment-extensions/collections/html-css-js/collection.json +41 -41
- package/augment-extensions/domain-rules/api-design/README.md +41 -41
- package/augment-extensions/domain-rules/api-design/module.json +27 -27
- package/augment-extensions/domain-rules/api-design/rules/authentication.md +263 -263
- package/augment-extensions/domain-rules/api-design/rules/documentation.md +395 -395
- package/augment-extensions/domain-rules/api-design/rules/error-handling.md +290 -290
- package/augment-extensions/domain-rules/api-design/rules/graphql-api.md +313 -313
- package/augment-extensions/domain-rules/api-design/rules/rest-api.md +214 -214
- package/augment-extensions/domain-rules/api-design/rules/versioning.md +268 -268
- package/augment-extensions/domain-rules/database/README.md +161 -161
- package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -793
- package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -1132
- package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -868
- package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -805
- package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -621
- package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -965
- package/augment-extensions/domain-rules/database/module.json +28 -28
- package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -624
- package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -588
- package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -856
- package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -778
- package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -963
- package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -1076
- package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -697
- package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -671
- package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -607
- package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -907
- package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -783
- package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -980
- package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -485
- package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -521
- package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -858
- package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -934
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/dracula/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/dracula/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/high-contrast/README.md +27 -27
- package/augment-extensions/domain-rules/design/color/themes/high-contrast/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/monokai/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/monokai/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/nord/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/nord/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/one-dark/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/one-dark/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/one-light/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/one-light/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/solarized-dark/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/solarized-dark/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/solarized-light/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/solarized-light/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/tokyo-night/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/tokyo-night/module.json +26 -26
- package/augment-extensions/domain-rules/mcp/README.md +150 -150
- package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -522
- package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -520
- package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -570
- package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -427
- package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -435
- package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -502
- package/augment-extensions/domain-rules/mcp/module.json +49 -49
- package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -595
- package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -345
- package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -687
- package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -636
- package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -484
- package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -360
- package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -393
- package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -194
- package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -625
- package/augment-extensions/domain-rules/security/README.md +41 -41
- package/augment-extensions/domain-rules/security/module.json +28 -28
- package/augment-extensions/domain-rules/security/rules/authentication-security.md +361 -361
- package/augment-extensions/domain-rules/security/rules/encryption.md +208 -208
- package/augment-extensions/domain-rules/security/rules/input-validation.md +294 -294
- package/augment-extensions/domain-rules/security/rules/owasp-top-10.md +339 -339
- package/augment-extensions/domain-rules/security/rules/secure-coding.md +293 -293
- package/augment-extensions/domain-rules/security/rules/web-security.md +268 -268
- package/augment-extensions/domain-rules/seo-sales-marketing/ANNOUNCEMENT.md +143 -0
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/README.md +140 -136
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/SCHEMA-VALIDATION-REPORT.md +216 -216
- package/augment-extensions/domain-rules/seo-sales-marketing/TEST-VALIDATION.md +129 -0
- package/augment-extensions/domain-rules/seo-sales-marketing/USAGE-GUIDES.md +254 -0
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/brand-kit-example.yaml +292 -292
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/campaign-brief-example.yaml +389 -389
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/content-calendar-example.yaml +643 -643
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/email-newsletter-example.md +376 -376
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/landing-page-example.md +934 -934
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/ppc-ad-copy-example.md +301 -301
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/seo-blog-post-example.md +347 -347
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/social-media-campaign-example.md +606 -606
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/module.json +50 -50
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/affiliate-influencer-marketing.md +593 -593
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/asset-management.md +418 -418
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/brand-consistency.md +210 -210
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/content-marketing.md +337 -337
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/conversion-optimization.md +455 -455
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/direct-sales.md +499 -499
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/email-marketing.md +439 -439
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/legal-compliance.md +227 -227
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/ppc-advertising.md +569 -569
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/seo-optimization.md +470 -470
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/social-media-marketing.md +414 -414
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/universal-marketing.md +177 -177
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/asset-inventory.schema.json +247 -247
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/brand-kit.schema.json +326 -326
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/campaign-brief.schema.json +342 -342
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/color-palette.schema.json +223 -223
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/content-template.schema.json +383 -383
- package/augment-extensions/domain-rules/wordpress/README.md +163 -163
- package/augment-extensions/domain-rules/wordpress/module.json +32 -32
- package/augment-extensions/domain-rules/wordpress/rules/coding-standards.md +617 -617
- package/augment-extensions/domain-rules/wordpress/rules/directory-structure.md +270 -270
- package/augment-extensions/domain-rules/wordpress/rules/file-patterns.md +423 -423
- package/augment-extensions/domain-rules/wordpress/rules/gutenberg-blocks.md +493 -493
- package/augment-extensions/domain-rules/wordpress/rules/performance.md +568 -568
- package/augment-extensions/domain-rules/wordpress/rules/plugin-development.md +510 -510
- package/augment-extensions/domain-rules/wordpress/rules/project-detection.md +251 -251
- package/augment-extensions/domain-rules/wordpress/rules/rest-api.md +501 -501
- package/augment-extensions/domain-rules/wordpress/rules/security.md +564 -564
- package/augment-extensions/domain-rules/wordpress/rules/theme-development.md +388 -388
- package/augment-extensions/domain-rules/wordpress/rules/woocommerce.md +441 -441
- package/augment-extensions/domain-rules/wordpress-plugin/README.md +139 -139
- package/augment-extensions/domain-rules/wordpress-plugin/examples/ajax-plugin.md +1599 -1599
- package/augment-extensions/domain-rules/wordpress-plugin/examples/custom-post-type-plugin.md +1727 -1727
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block-plugin.md +428 -428
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block.md +422 -422
- package/augment-extensions/domain-rules/wordpress-plugin/examples/mvc-plugin.md +1623 -1623
- package/augment-extensions/domain-rules/wordpress-plugin/examples/object-oriented-plugin.md +1343 -1343
- package/augment-extensions/domain-rules/wordpress-plugin/examples/rest-endpoint.md +734 -734
- package/augment-extensions/domain-rules/wordpress-plugin/examples/settings-page-plugin.md +1350 -1350
- package/augment-extensions/domain-rules/wordpress-plugin/examples/simple-procedural-plugin.md +503 -503
- package/augment-extensions/domain-rules/wordpress-plugin/examples/singleton-plugin.md +971 -971
- package/augment-extensions/domain-rules/wordpress-plugin/module.json +53 -53
- package/augment-extensions/domain-rules/wordpress-plugin/rules/activation-hooks.md +770 -770
- package/augment-extensions/domain-rules/wordpress-plugin/rules/admin-interface.md +874 -874
- package/augment-extensions/domain-rules/wordpress-plugin/rules/ajax-handlers.md +629 -629
- package/augment-extensions/domain-rules/wordpress-plugin/rules/asset-management.md +559 -559
- package/augment-extensions/domain-rules/wordpress-plugin/rules/context-providers.md +709 -709
- package/augment-extensions/domain-rules/wordpress-plugin/rules/cron-jobs.md +736 -736
- package/augment-extensions/domain-rules/wordpress-plugin/rules/database-management.md +1057 -1057
- package/augment-extensions/domain-rules/wordpress-plugin/rules/documentation-standards.md +463 -463
- package/augment-extensions/domain-rules/wordpress-plugin/rules/frontend-functionality.md +478 -478
- package/augment-extensions/domain-rules/wordpress-plugin/rules/gutenberg-blocks.md +818 -818
- package/augment-extensions/domain-rules/wordpress-plugin/rules/internationalization.md +416 -416
- package/augment-extensions/domain-rules/wordpress-plugin/rules/migration.md +667 -667
- package/augment-extensions/domain-rules/wordpress-plugin/rules/performance-optimization.md +878 -878
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-architecture.md +693 -693
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-structure.md +352 -352
- package/augment-extensions/domain-rules/wordpress-plugin/rules/rest-api.md +818 -818
- package/augment-extensions/domain-rules/wordpress-plugin/rules/scaffolding-workflow.md +624 -624
- package/augment-extensions/domain-rules/wordpress-plugin/rules/security-best-practices.md +866 -866
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing-patterns.md +1165 -1165
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing.md +414 -414
- package/augment-extensions/domain-rules/wordpress-plugin/rules/vscode-integration.md +751 -751
- package/augment-extensions/domain-rules/wordpress-plugin/rules/woocommerce-integration.md +949 -949
- package/augment-extensions/domain-rules/wordpress-plugin/rules/wordpress-org-submission.md +458 -458
- package/augment-extensions/examples/design-patterns/README.md +37 -37
- package/augment-extensions/examples/design-patterns/examples/behavioral-patterns.md +370 -370
- package/augment-extensions/examples/design-patterns/examples/creational-patterns.md +250 -250
- package/augment-extensions/examples/design-patterns/examples/structural-patterns.md +264 -264
- package/augment-extensions/examples/design-patterns/module.json +27 -27
- package/augment-extensions/examples/gutenberg-block-plugin/README.md +101 -101
- package/augment-extensions/examples/gutenberg-block-plugin/examples/testimonial-block.md +428 -428
- package/augment-extensions/examples/gutenberg-block-plugin/module.json +40 -40
- package/augment-extensions/examples/rest-api-plugin/README.md +98 -98
- package/augment-extensions/examples/rest-api-plugin/examples/task-manager-api.md +1299 -1299
- package/augment-extensions/examples/rest-api-plugin/module.json +40 -40
- package/augment-extensions/examples/woocommerce-extension/README.md +98 -98
- package/augment-extensions/examples/woocommerce-extension/examples/product-customizer.md +763 -763
- package/augment-extensions/examples/woocommerce-extension/module.json +40 -40
- package/augment-extensions/workflows/beads/README.md +135 -135
- package/augment-extensions/workflows/beads/examples/complete-workflow-example.md +278 -278
- package/augment-extensions/workflows/beads/module.json +55 -55
- package/augment-extensions/workflows/beads/rules/best-practices.md +398 -398
- package/augment-extensions/workflows/beads/rules/file-format.md +327 -327
- package/augment-extensions/workflows/beads/rules/manual-setup.md +315 -315
- package/augment-extensions/workflows/beads/rules/workflow.md +326 -326
- package/augment-extensions/workflows/beads-integration/IMPLEMENTATION-STATUS.md +145 -145
- package/augment-extensions/workflows/beads-integration/README.md +143 -143
- package/augment-extensions/workflows/beads-integration/config/defaults.json +32 -32
- package/augment-extensions/workflows/beads-integration/config/schema.json +140 -140
- package/augment-extensions/workflows/beads-integration/examples/basic-task-generation.md +293 -293
- package/augment-extensions/workflows/beads-integration/module.json +75 -75
- package/augment-extensions/workflows/beads-integration/rules/core-rules.md +219 -219
- package/augment-extensions/workflows/beads-integration/rules/effectiveness-standards.md +256 -256
- package/augment-extensions/workflows/beads-integration/rules/task-generation.md +607 -607
- package/augment-extensions/workflows/database/README.md +195 -195
- package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -295
- package/augment-extensions/workflows/database/examples/migration-example.md +498 -498
- package/augment-extensions/workflows/database/examples/optimization-example.md +496 -496
- package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -444
- package/augment-extensions/workflows/database/module.json +42 -42
- package/augment-extensions/workflows/database/rules/data-migration.md +249 -249
- package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -339
- package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -352
- package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -435
- package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -535
- package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -305
- package/augment-extensions/workflows/database/rules/workflow.md +458 -458
- package/augment-extensions/workflows/wordpress-plugin/README.md +232 -232
- package/augment-extensions/workflows/wordpress-plugin/ai-prompts.md +839 -839
- package/augment-extensions/workflows/wordpress-plugin/bead-decomposition-patterns.md +854 -854
- package/augment-extensions/workflows/wordpress-plugin/examples/complete-plugin-example.md +540 -540
- package/augment-extensions/workflows/wordpress-plugin/examples/custom-post-type-example.md +1083 -1083
- package/augment-extensions/workflows/wordpress-plugin/examples/feature-addition-workflow.md +669 -669
- package/augment-extensions/workflows/wordpress-plugin/examples/plugin-creation-workflow.md +597 -597
- package/augment-extensions/workflows/wordpress-plugin/examples/secure-form-handler-example.md +925 -925
- package/augment-extensions/workflows/wordpress-plugin/examples/security-audit-workflow.md +752 -752
- package/augment-extensions/workflows/wordpress-plugin/examples/wordpress-org-submission-workflow.md +773 -773
- package/augment-extensions/workflows/wordpress-plugin/module.json +49 -49
- package/augment-extensions/workflows/wordpress-plugin/rules/best-practices.md +942 -942
- package/augment-extensions/workflows/wordpress-plugin/rules/development-workflow.md +702 -702
- package/augment-extensions/workflows/wordpress-plugin/rules/submission-workflow.md +728 -728
- package/augment-extensions/workflows/wordpress-plugin/rules/testing-workflow.md +775 -775
- package/augment-extensions/writing-standards/screenplay/README.md +339 -300
- package/augment-extensions/writing-standards/screenplay/_templates/README.md +121 -121
- package/augment-extensions/writing-standards/screenplay/_templates/genre-template.md +153 -153
- package/augment-extensions/writing-standards/screenplay/_templates/style-template.md +243 -243
- package/augment-extensions/writing-standards/screenplay/_templates/theme-template.md +213 -213
- package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -164
- package/augment-extensions/writing-standards/screenplay/examples/beat-sheet-example.yaml +95 -95
- package/augment-extensions/writing-standards/screenplay/examples/character-profile-example.yaml +116 -116
- package/augment-extensions/writing-standards/screenplay/examples/commercial-30sec.fountain +151 -151
- package/augment-extensions/writing-standards/screenplay/examples/independent-monologue.fountain +67 -67
- package/augment-extensions/writing-standards/screenplay/examples/news-segment.fountain +142 -142
- package/augment-extensions/writing-standards/screenplay/examples/plot-outline-example.yaml +184 -184
- package/augment-extensions/writing-standards/screenplay/examples/tv-episode-teaser.fountain +204 -204
- package/augment-extensions/writing-standards/screenplay/genres/README.md +181 -181
- package/augment-extensions/writing-standards/screenplay/genres/examples/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/genres/module.json +70 -70
- package/augment-extensions/writing-standards/screenplay/genres/rules/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/genres/rules/action.md +399 -399
- package/augment-extensions/writing-standards/screenplay/genres/rules/adventure.md +407 -407
- package/augment-extensions/writing-standards/screenplay/genres/rules/animation.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/biographical.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/comedy.md +401 -401
- package/augment-extensions/writing-standards/screenplay/genres/rules/documentary.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/drama.md +409 -409
- package/augment-extensions/writing-standards/screenplay/genres/rules/fantasy.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/historical.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/horror.md +268 -268
- package/augment-extensions/writing-standards/screenplay/genres/rules/musical.md +294 -294
- package/augment-extensions/writing-standards/screenplay/genres/rules/mystery.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/noir.md +294 -294
- package/augment-extensions/writing-standards/screenplay/genres/rules/romance.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/sci-fi.md +289 -289
- package/augment-extensions/writing-standards/screenplay/genres/rules/superhero.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/thriller.md +294 -294
- package/augment-extensions/writing-standards/screenplay/genres/rules/western.md +293 -293
- package/augment-extensions/writing-standards/screenplay/module.json +124 -124
- package/augment-extensions/writing-standards/screenplay/rules/aaa-hollywood-films.md +339 -339
- package/augment-extensions/writing-standards/screenplay/rules/ai-integration-testing.md +329 -329
- package/augment-extensions/writing-standards/screenplay/rules/character-development.md +169 -169
- package/augment-extensions/writing-standards/screenplay/rules/commercials.md +437 -437
- package/augment-extensions/writing-standards/screenplay/rules/dialogue-writing.md +263 -263
- package/augment-extensions/writing-standards/screenplay/rules/diversity-inclusion.md +261 -261
- package/augment-extensions/writing-standards/screenplay/rules/examples-guide.md +315 -315
- package/augment-extensions/writing-standards/screenplay/rules/file-organization.md +213 -0
- package/augment-extensions/writing-standards/screenplay/rules/formatting-validation.md +413 -413
- package/augment-extensions/writing-standards/screenplay/rules/fountain-format.md +372 -372
- package/augment-extensions/writing-standards/screenplay/rules/independent-films.md +374 -374
- package/augment-extensions/writing-standards/screenplay/rules/live-tv-productions.md +443 -443
- package/augment-extensions/writing-standards/screenplay/rules/narrative-structures.md +207 -207
- package/augment-extensions/writing-standards/screenplay/rules/news-broadcasts.md +444 -444
- package/augment-extensions/writing-standards/screenplay/rules/pacing-timing.md +331 -331
- package/augment-extensions/writing-standards/screenplay/rules/quality-review-checklist.md +334 -334
- package/augment-extensions/writing-standards/screenplay/rules/quick-reference.md +299 -299
- package/augment-extensions/writing-standards/screenplay/rules/screen-continuity.md +263 -263
- package/augment-extensions/writing-standards/screenplay/rules/streaming-content.md +412 -412
- package/augment-extensions/writing-standards/screenplay/rules/trope-management.md +370 -370
- package/augment-extensions/writing-standards/screenplay/rules/tv-series.md +374 -374
- package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -339
- package/augment-extensions/writing-standards/screenplay/rules/vscode-integration.md +277 -277
- package/augment-extensions/writing-standards/screenplay/rules/web-content.md +393 -393
- package/augment-extensions/writing-standards/screenplay/schemas/beat-sheet.json +332 -332
- package/augment-extensions/writing-standards/screenplay/schemas/character-profile.json +247 -247
- package/augment-extensions/writing-standards/screenplay/schemas/feature-selection.json +200 -200
- package/augment-extensions/writing-standards/screenplay/schemas/plot-outline.json +233 -233
- package/augment-extensions/writing-standards/screenplay/schemas/screenplay-config.json +245 -245
- package/augment-extensions/writing-standards/screenplay/schemas/trope-inventory.json +221 -221
- package/augment-extensions/writing-standards/screenplay/styles/README.md +159 -159
- package/augment-extensions/writing-standards/screenplay/styles/examples/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/styles/examples/style-applications.md +1449 -1449
- package/augment-extensions/writing-standards/screenplay/styles/module.json +64 -64
- package/augment-extensions/writing-standards/screenplay/styles/rules/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/styles/rules/dialogue-centric.md +520 -520
- package/augment-extensions/writing-standards/screenplay/styles/rules/ensemble.md +499 -499
- package/augment-extensions/writing-standards/screenplay/styles/rules/epic.md +497 -497
- package/augment-extensions/writing-standards/screenplay/styles/rules/experimental.md +492 -492
- package/augment-extensions/writing-standards/screenplay/styles/rules/flashback.md +509 -509
- package/augment-extensions/writing-standards/screenplay/styles/rules/linear.md +490 -490
- package/augment-extensions/writing-standards/screenplay/styles/rules/minimalist.md +499 -499
- package/augment-extensions/writing-standards/screenplay/styles/rules/non-linear.md +501 -501
- package/augment-extensions/writing-standards/screenplay/styles/rules/poetic.md +499 -499
- package/augment-extensions/writing-standards/screenplay/styles/rules/realistic.md +498 -498
- package/augment-extensions/writing-standards/screenplay/styles/rules/satirical.md +499 -499
- package/augment-extensions/writing-standards/screenplay/styles/rules/surreal.md +508 -508
- package/augment-extensions/writing-standards/screenplay/styles/rules/voice-over.md +500 -500
- package/augment-extensions/writing-standards/screenplay/themes/README.md +158 -158
- package/augment-extensions/writing-standards/screenplay/themes/examples/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/themes/examples/common-mistakes-and-fixes.md +643 -643
- package/augment-extensions/writing-standards/screenplay/themes/examples/complete-scene-example.md +311 -311
- package/augment-extensions/writing-standards/screenplay/themes/examples/individual-theme-examples.md +562 -562
- package/augment-extensions/writing-standards/screenplay/themes/examples/multi-theme-weaving.md +538 -538
- package/augment-extensions/writing-standards/screenplay/themes/examples/theme-application-guide.md +432 -432
- package/augment-extensions/writing-standards/screenplay/themes/examples/theme-integration-across-acts.md +637 -637
- package/augment-extensions/writing-standards/screenplay/themes/module.json +66 -66
- package/augment-extensions/writing-standards/screenplay/themes/rules/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/themes/rules/ambition.md +458 -458
- package/augment-extensions/writing-standards/screenplay/themes/rules/betrayal.md +490 -490
- package/augment-extensions/writing-standards/screenplay/themes/rules/environment.md +458 -458
- package/augment-extensions/writing-standards/screenplay/themes/rules/fate.md +459 -459
- package/augment-extensions/writing-standards/screenplay/themes/rules/friendship.md +491 -491
- package/augment-extensions/writing-standards/screenplay/themes/rules/growth.md +491 -491
- package/augment-extensions/writing-standards/screenplay/themes/rules/identity.md +490 -490
- package/augment-extensions/writing-standards/screenplay/themes/rules/isolation.md +464 -464
- package/augment-extensions/writing-standards/screenplay/themes/rules/justice.md +461 -461
- package/augment-extensions/writing-standards/screenplay/themes/rules/love.md +489 -489
- package/augment-extensions/writing-standards/screenplay/themes/rules/power.md +494 -494
- package/augment-extensions/writing-standards/screenplay/themes/rules/redemption.md +483 -483
- package/augment-extensions/writing-standards/screenplay/themes/rules/revenge.md +489 -489
- package/augment-extensions/writing-standards/screenplay/themes/rules/survival.md +496 -496
- package/augment-extensions/writing-standards/screenplay/themes/rules/technology.md +463 -463
- package/augment-extensions/writing-standards/screenplay/utils/__tests__/file-organization.test.ts +169 -0
- package/augment-extensions/writing-standards/screenplay/utils/file-organization.ts +165 -0
- package/cli/MODULES.md +302 -302
- package/cli/dist/cli.js +113 -22
- package/cli/dist/cli.js.map +1 -1
- package/cli/dist/commands/gui.d.ts.map +1 -1
- package/cli/dist/commands/gui.js +54 -6
- package/cli/dist/commands/gui.js.map +1 -1
- package/cli/dist/commands/init.d.ts.map +1 -1
- package/cli/dist/commands/init.js +76 -23
- package/cli/dist/commands/init.js.map +1 -1
- package/cli/dist/commands/self-remove.d.ts.map +1 -1
- package/cli/dist/commands/self-remove.js +48 -74
- package/cli/dist/commands/self-remove.js.map +1 -1
- package/cli/dist/commands/show.d.ts +15 -0
- package/cli/dist/commands/show.d.ts.map +1 -1
- package/cli/dist/commands/show.js +576 -23
- package/cli/dist/commands/show.js.map +1 -1
- package/cli/dist/commands/showCompleted.d.ts +21 -0
- package/cli/dist/commands/showCompleted.d.ts.map +1 -0
- package/cli/dist/commands/showCompleted.js +225 -0
- package/cli/dist/commands/showCompleted.js.map +1 -0
- package/cli/dist/commands/skill.js +88 -88
- package/cli/dist/commands/update.d.ts +2 -0
- package/cli/dist/commands/update.d.ts.map +1 -1
- package/cli/dist/commands/update.js +67 -1
- package/cli/dist/commands/update.js.map +1 -1
- package/cli/dist/utils/beadsCompletedChecker.d.ts +72 -0
- package/cli/dist/utils/beadsCompletedChecker.d.ts.map +1 -0
- package/cli/dist/utils/beadsCompletedChecker.js +198 -0
- package/cli/dist/utils/beadsCompletedChecker.js.map +1 -0
- package/cli/dist/utils/catalog-sync.js +13 -13
- package/cli/dist/utils/config-system.d.ts +111 -0
- package/cli/dist/utils/config-system.d.ts.map +1 -0
- package/cli/dist/utils/config-system.js +239 -0
- package/cli/dist/utils/config-system.js.map +1 -0
- package/cli/dist/utils/extractCommandHelp.d.ts +51 -0
- package/cli/dist/utils/extractCommandHelp.d.ts.map +1 -0
- package/cli/dist/utils/extractCommandHelp.js +250 -0
- package/cli/dist/utils/extractCommandHelp.js.map +1 -0
- package/cli/dist/utils/hook-system.d.ts +84 -0
- package/cli/dist/utils/hook-system.d.ts.map +1 -0
- package/cli/dist/utils/hook-system.js +151 -0
- package/cli/dist/utils/hook-system.js.map +1 -0
- package/cli/dist/utils/inspection-cache.d.ts +56 -0
- package/cli/dist/utils/inspection-cache.d.ts.map +1 -0
- package/cli/dist/utils/inspection-cache.js +166 -0
- package/cli/dist/utils/inspection-cache.js.map +1 -0
- package/cli/dist/utils/inspection-handlers.d.ts +75 -0
- package/cli/dist/utils/inspection-handlers.d.ts.map +1 -0
- package/cli/dist/utils/inspection-handlers.js +171 -0
- package/cli/dist/utils/inspection-handlers.js.map +1 -0
- package/cli/dist/utils/install-rules.js +55 -55
- package/cli/dist/utils/mcp-integration.js +44 -44
- package/cli/dist/utils/module-system.d.ts +1 -0
- package/cli/dist/utils/module-system.d.ts.map +1 -1
- package/cli/dist/utils/module-system.js +8 -3
- package/cli/dist/utils/module-system.js.map +1 -1
- package/cli/dist/utils/plugin-system.d.ts +133 -0
- package/cli/dist/utils/plugin-system.d.ts.map +1 -0
- package/cli/dist/utils/plugin-system.js +210 -0
- package/cli/dist/utils/plugin-system.js.map +1 -0
- package/cli/dist/utils/progress.d.ts +67 -0
- package/cli/dist/utils/progress.d.ts.map +1 -0
- package/cli/dist/utils/progress.js +146 -0
- package/cli/dist/utils/progress.js.map +1 -0
- package/cli/dist/utils/rule-install-hooks.js +8 -8
- package/cli/dist/utils/stream-reader.d.ts +34 -0
- package/cli/dist/utils/stream-reader.d.ts.map +1 -0
- package/cli/dist/utils/stream-reader.js +147 -0
- package/cli/dist/utils/stream-reader.js.map +1 -0
- package/cli/dist/utils/vscode-editor.d.ts +45 -0
- package/cli/dist/utils/vscode-editor.d.ts.map +1 -0
- package/cli/dist/utils/vscode-editor.js +171 -0
- package/cli/dist/utils/vscode-editor.js.map +1 -0
- package/cli/dist/utils/vscode-links.d.ts +49 -0
- package/cli/dist/utils/vscode-links.d.ts.map +1 -0
- package/cli/dist/utils/vscode-links.js +167 -0
- package/cli/dist/utils/vscode-links.js.map +1 -0
- package/modules.md +667 -630
- package/package.json +85 -85
|
@@ -1,426 +1,426 @@
|
|
|
1
|
-
# PHP Web Applications Best Practices
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
|
|
5
|
-
This guide provides best practices for developing PHP web applications using MVC architecture, modern frameworks (Laravel, Symfony), templating engines, and secure form handling.
|
|
6
|
-
|
|
7
|
-
## MVC Architecture
|
|
8
|
-
|
|
9
|
-
### Controllers
|
|
10
|
-
|
|
11
|
-
**Keep controllers thin** - Controllers should delegate business logic to services.
|
|
12
|
-
|
|
13
|
-
```php
|
|
14
|
-
<?php
|
|
15
|
-
|
|
16
|
-
namespace App\Controllers;
|
|
17
|
-
|
|
18
|
-
use App\Services\UserService;
|
|
19
|
-
use Symfony\Component\HttpFoundation\Request;
|
|
20
|
-
use Symfony\Component\HttpFoundation\Response;
|
|
21
|
-
|
|
22
|
-
class UserController
|
|
23
|
-
{
|
|
24
|
-
public function __construct(
|
|
25
|
-
private UserService $userService
|
|
26
|
-
) {}
|
|
27
|
-
|
|
28
|
-
public function index(): Response
|
|
29
|
-
{
|
|
30
|
-
// Thin controller - delegates to service
|
|
31
|
-
$users = $this->userService->getAllUsers();
|
|
32
|
-
|
|
33
|
-
return $this->render('users/index', [
|
|
34
|
-
'users' => $users
|
|
35
|
-
]);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
public function store(Request $request): Response
|
|
39
|
-
{
|
|
40
|
-
// Validate and delegate
|
|
41
|
-
$validated = $this->validate($request, [
|
|
42
|
-
'name' => 'required|string|max:255',
|
|
43
|
-
'email' => 'required|email|unique:users'
|
|
44
|
-
]);
|
|
45
|
-
|
|
46
|
-
$user = $this->userService->createUser($validated);
|
|
47
|
-
|
|
48
|
-
return $this->redirect('/users/' . $user->id);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
### Models
|
|
54
|
-
|
|
55
|
-
**Models handle data logic** - Use Eloquent ORM or Doctrine for database interactions.
|
|
56
|
-
|
|
57
|
-
```php
|
|
58
|
-
<?php
|
|
59
|
-
|
|
60
|
-
namespace App\Models;
|
|
61
|
-
|
|
62
|
-
use Illuminate\Database\Eloquent\Model;
|
|
63
|
-
use Illuminate\Database\Eloquent\Relations\HasMany;
|
|
64
|
-
|
|
65
|
-
class User extends Model
|
|
66
|
-
{
|
|
67
|
-
protected $fillable = ['name', 'email', 'password'];
|
|
68
|
-
|
|
69
|
-
protected $hidden = ['password', 'remember_token'];
|
|
70
|
-
|
|
71
|
-
protected $casts = [
|
|
72
|
-
'email_verified_at' => 'datetime',
|
|
73
|
-
'is_active' => 'boolean'
|
|
74
|
-
];
|
|
75
|
-
|
|
76
|
-
// Relationships
|
|
77
|
-
public function posts(): HasMany
|
|
78
|
-
{
|
|
79
|
-
return $this->hasMany(Post::class);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// Accessors
|
|
83
|
-
public function getFullNameAttribute(): string
|
|
84
|
-
{
|
|
85
|
-
return "{$this->first_name} {$this->last_name}";
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// Scopes
|
|
89
|
-
public function scopeActive($query)
|
|
90
|
-
{
|
|
91
|
-
return $query->where('is_active', true);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
### Views
|
|
97
|
-
|
|
98
|
-
**Minimal logic in views** - Use template engines with auto-escaping.
|
|
99
|
-
|
|
100
|
-
```php
|
|
101
|
-
<!-- Blade Template (Laravel) -->
|
|
102
|
-
@extends('layouts.app')
|
|
103
|
-
|
|
104
|
-
@section('content')
|
|
105
|
-
<h1>{{ $title }}</h1>
|
|
106
|
-
|
|
107
|
-
@foreach($users as $user)
|
|
108
|
-
<div class="user-card">
|
|
109
|
-
<h2>{{ $user->name }}</h2>
|
|
110
|
-
<p>{{ $user->email }}</p>
|
|
111
|
-
|
|
112
|
-
@if($user->is_active)
|
|
113
|
-
<span class="badge badge-success">Active</span>
|
|
114
|
-
@else
|
|
115
|
-
<span class="badge badge-danger">Inactive</span>
|
|
116
|
-
@endif
|
|
117
|
-
</div>
|
|
118
|
-
@endforeach
|
|
119
|
-
@endsection
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
## Routing
|
|
123
|
-
|
|
124
|
-
### RESTful Routes
|
|
125
|
-
|
|
126
|
-
```php
|
|
127
|
-
<?php
|
|
128
|
-
|
|
129
|
-
use App\Controllers\UserController;
|
|
130
|
-
use Illuminate\Support\Facades\Route;
|
|
131
|
-
|
|
132
|
-
// RESTful resource routes
|
|
133
|
-
Route::resource('users', UserController::class);
|
|
134
|
-
|
|
135
|
-
// Generates:
|
|
136
|
-
// GET /users -> index()
|
|
137
|
-
// GET /users/create -> create()
|
|
138
|
-
// POST /users -> store()
|
|
139
|
-
// GET /users/{id} -> show()
|
|
140
|
-
// GET /users/{id}/edit -> edit()
|
|
141
|
-
// PUT /users/{id} -> update()
|
|
142
|
-
// DELETE /users/{id} -> destroy()
|
|
143
|
-
|
|
144
|
-
// Route model binding
|
|
145
|
-
Route::get('/users/{user}', function (User $user) {
|
|
146
|
-
return view('users.show', ['user' => $user]);
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
// Route groups with middleware
|
|
150
|
-
Route::middleware(['auth', 'verified'])->group(function () {
|
|
151
|
-
Route::get('/dashboard', [DashboardController::class, 'index']);
|
|
152
|
-
Route::resource('posts', PostController::class);
|
|
153
|
-
});
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
## Template Engines
|
|
157
|
-
|
|
158
|
-
### Twig (Symfony)
|
|
159
|
-
|
|
160
|
-
```php
|
|
161
|
-
<?php
|
|
162
|
-
|
|
163
|
-
// Controller
|
|
164
|
-
return $this->render('user/profile.html.twig', [
|
|
165
|
-
'user' => $user,
|
|
166
|
-
'posts' => $posts
|
|
167
|
-
]);
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
```twig
|
|
171
|
-
{# Template: user/profile.html.twig #}
|
|
172
|
-
{% extends 'base.html.twig' %}
|
|
173
|
-
|
|
174
|
-
{% block title %}{{ user.name }} - Profile{% endblock %}
|
|
175
|
-
|
|
176
|
-
{% block content %}
|
|
177
|
-
<h1>{{ user.name }}</h1>
|
|
178
|
-
<p>{{ user.email }}</p>
|
|
179
|
-
|
|
180
|
-
{# Auto-escaping enabled by default #}
|
|
181
|
-
<div>{{ user.bio }}</div>
|
|
182
|
-
|
|
183
|
-
{# Raw output (use with caution) #}
|
|
184
|
-
<div>{{ user.html_content|raw }}</div>
|
|
185
|
-
|
|
186
|
-
{# Loops #}
|
|
187
|
-
{% for post in posts %}
|
|
188
|
-
<article>
|
|
189
|
-
<h2>{{ post.title }}</h2>
|
|
190
|
-
<p>{{ post.excerpt }}</p>
|
|
191
|
-
</article>
|
|
192
|
-
{% endfor %}
|
|
193
|
-
{% endblock %}
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
### Blade (Laravel)
|
|
197
|
-
|
|
198
|
-
```php
|
|
199
|
-
{{-- Template inheritance --}}
|
|
200
|
-
@extends('layouts.app')
|
|
201
|
-
|
|
202
|
-
@section('title', 'User Profile')
|
|
203
|
-
|
|
204
|
-
@section('content')
|
|
205
|
-
<h1>{{ $user->name }}</h1>
|
|
206
|
-
|
|
207
|
-
{{-- Components --}}
|
|
208
|
-
<x-alert type="success">
|
|
209
|
-
Profile updated successfully!
|
|
210
|
-
</x-alert>
|
|
211
|
-
|
|
212
|
-
{{-- Directives --}}
|
|
213
|
-
@auth
|
|
214
|
-
<a href="/profile/edit">Edit Profile</a>
|
|
215
|
-
@endauth
|
|
216
|
-
|
|
217
|
-
@include('partials.user-stats', ['user' => $user])
|
|
218
|
-
@endsection
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
## Form Handling
|
|
222
|
-
|
|
223
|
-
### CSRF Protection
|
|
224
|
-
|
|
225
|
-
**Always use CSRF tokens** for forms.
|
|
226
|
-
|
|
227
|
-
```php
|
|
228
|
-
<!-- Blade -->
|
|
229
|
-
<form method="POST" action="/users">
|
|
230
|
-
@csrf
|
|
231
|
-
<input type="text" name="name" value="{{ old('name') }}">
|
|
232
|
-
<button type="submit">Submit</button>
|
|
233
|
-
</form>
|
|
234
|
-
|
|
235
|
-
<!-- Twig -->
|
|
236
|
-
<form method="post" action="{{ path('user_create') }}">
|
|
237
|
-
<input type="hidden" name="_token" value="{{ csrf_token('user_create') }}">
|
|
238
|
-
<input type="text" name="name">
|
|
239
|
-
<button type="submit">Submit</button>
|
|
240
|
-
</form>
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
### Form Validation
|
|
244
|
-
|
|
245
|
-
**Use dedicated validation classes** (Form Requests in Laravel).
|
|
246
|
-
|
|
247
|
-
```php
|
|
248
|
-
<?php
|
|
249
|
-
|
|
250
|
-
namespace App\Http\Requests;
|
|
251
|
-
|
|
252
|
-
use Illuminate\Foundation\Http\FormRequest;
|
|
253
|
-
|
|
254
|
-
class StoreUserRequest extends FormRequest
|
|
255
|
-
{
|
|
256
|
-
public function authorize(): bool
|
|
257
|
-
{
|
|
258
|
-
return $this->user()->can('create', User::class);
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
public function rules(): array
|
|
262
|
-
{
|
|
263
|
-
return [
|
|
264
|
-
'name' => 'required|string|max:255',
|
|
265
|
-
'email' => 'required|email|unique:users,email',
|
|
266
|
-
'password' => 'required|min:8|confirmed',
|
|
267
|
-
'age' => 'nullable|integer|min:18|max:120',
|
|
268
|
-
'role' => 'required|in:user,admin,moderator'
|
|
269
|
-
];
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
public function messages(): array
|
|
273
|
-
{
|
|
274
|
-
return [
|
|
275
|
-
'name.required' => 'Please provide your name',
|
|
276
|
-
'email.unique' => 'This email is already registered',
|
|
277
|
-
'password.min' => 'Password must be at least 8 characters'
|
|
278
|
-
];
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
// Controller usage
|
|
283
|
-
public function store(StoreUserRequest $request)
|
|
284
|
-
{
|
|
285
|
-
// Validation already passed
|
|
286
|
-
$validated = $request->validated();
|
|
287
|
-
|
|
288
|
-
$user = User::create($validated);
|
|
289
|
-
|
|
290
|
-
return redirect('/users')->with('success', 'User created!');
|
|
291
|
-
}
|
|
292
|
-
```
|
|
293
|
-
|
|
294
|
-
### Displaying Validation Errors
|
|
295
|
-
|
|
296
|
-
```php
|
|
297
|
-
<!-- Blade -->
|
|
298
|
-
@if ($errors->any())
|
|
299
|
-
<div class="alert alert-danger">
|
|
300
|
-
<ul>
|
|
301
|
-
@foreach ($errors->all() as $error)
|
|
302
|
-
<li>{{ $error }}</li>
|
|
303
|
-
@endforeach
|
|
304
|
-
</ul>
|
|
305
|
-
</div>
|
|
306
|
-
@endif
|
|
307
|
-
|
|
308
|
-
<!-- Field-specific errors -->
|
|
309
|
-
<input type="text" name="email" value="{{ old('email') }}"
|
|
310
|
-
class="@error('email') is-invalid @enderror">
|
|
311
|
-
@error('email')
|
|
312
|
-
<span class="error">{{ $message }}</span>
|
|
313
|
-
@enderror
|
|
314
|
-
```
|
|
315
|
-
|
|
316
|
-
## Middleware
|
|
317
|
-
|
|
318
|
-
### Creating Middleware
|
|
319
|
-
|
|
320
|
-
```php
|
|
321
|
-
<?php
|
|
322
|
-
|
|
323
|
-
namespace App\Http\Middleware;
|
|
324
|
-
|
|
325
|
-
use Closure;
|
|
326
|
-
use Illuminate\Http\Request;
|
|
327
|
-
|
|
328
|
-
class CheckUserRole
|
|
329
|
-
{
|
|
330
|
-
public function handle(Request $request, Closure $next, string $role)
|
|
331
|
-
{
|
|
332
|
-
if (!$request->user() || !$request->user()->hasRole($role)) {
|
|
333
|
-
abort(403, 'Unauthorized action.');
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
return $next($request);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
// Usage in routes
|
|
341
|
-
Route::middleware(['auth', 'role:admin'])->group(function () {
|
|
342
|
-
Route::get('/admin/dashboard', [AdminController::class, 'index']);
|
|
343
|
-
});
|
|
344
|
-
```
|
|
345
|
-
|
|
346
|
-
## Session Management
|
|
347
|
-
|
|
348
|
-
### Using Sessions
|
|
349
|
-
|
|
350
|
-
```php
|
|
351
|
-
<?php
|
|
352
|
-
|
|
353
|
-
// Store data
|
|
354
|
-
session(['key' => 'value']);
|
|
355
|
-
$request->session()->put('user_id', $user->id);
|
|
356
|
-
|
|
357
|
-
// Retrieve data
|
|
358
|
-
$value = session('key');
|
|
359
|
-
$userId = $request->session()->get('user_id');
|
|
360
|
-
|
|
361
|
-
// Flash data (available for next request only)
|
|
362
|
-
$request->session()->flash('status', 'Task was successful!');
|
|
363
|
-
|
|
364
|
-
// Regenerate session ID (after login)
|
|
365
|
-
$request->session()->regenerate();
|
|
366
|
-
|
|
367
|
-
// Destroy session (logout)
|
|
368
|
-
$request->session()->invalidate();
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
## Best Practices
|
|
372
|
-
|
|
373
|
-
### ✅ DO
|
|
374
|
-
|
|
375
|
-
- Use route model binding for automatic model injection
|
|
376
|
-
- Implement middleware for cross-cutting concerns (auth, logging, CORS)
|
|
377
|
-
- Use service classes for complex business logic
|
|
378
|
-
- Leverage dependency injection for testability
|
|
379
|
-
- Use database migrations for schema management
|
|
380
|
-
- Implement proper error handling and logging
|
|
381
|
-
- Use environment variables for configuration
|
|
382
|
-
- Enable HTTPS in production
|
|
383
|
-
- Implement rate limiting for public endpoints
|
|
384
|
-
- Use queues for long-running tasks
|
|
385
|
-
|
|
386
|
-
### ❌ DON'T
|
|
387
|
-
|
|
388
|
-
- Put business logic in controllers or views
|
|
389
|
-
- Use raw SQL queries without parameter binding
|
|
390
|
-
- Store sensitive data in sessions without encryption
|
|
391
|
-
- Disable CSRF protection
|
|
392
|
-
- Use `extract()` on user input
|
|
393
|
-
- Echo user input without escaping
|
|
394
|
-
- Use `eval()` or similar dangerous functions
|
|
395
|
-
- Hardcode credentials or API keys
|
|
396
|
-
- Ignore validation errors
|
|
397
|
-
- Use global variables for state management
|
|
398
|
-
|
|
399
|
-
## Security Checklist
|
|
400
|
-
|
|
401
|
-
- [ ] CSRF tokens on all forms
|
|
402
|
-
- [ ] Input validation on all user data
|
|
403
|
-
- [ ] Output escaping in all views
|
|
404
|
-
- [ ] Prepared statements for database queries
|
|
405
|
-
- [ ] HTTPS enforced in production
|
|
406
|
-
- [ ] Secure session configuration (httponly, secure flags)
|
|
407
|
-
- [ ] Password hashing with bcrypt/argon2
|
|
408
|
-
- [ ] Rate limiting on authentication endpoints
|
|
409
|
-
- [ ] SQL injection prevention
|
|
410
|
-
- [ ] XSS prevention
|
|
411
|
-
- [ ] File upload validation
|
|
412
|
-
- [ ] Proper error handling (don't expose stack traces)
|
|
413
|
-
|
|
414
|
-
## Performance Tips
|
|
415
|
-
|
|
416
|
-
- Use eager loading to avoid N+1 queries
|
|
417
|
-
- Implement caching for frequently accessed data
|
|
418
|
-
- Use database indexes on frequently queried columns
|
|
419
|
-
- Optimize images and assets
|
|
420
|
-
- Enable OPcache in production
|
|
421
|
-
- Use CDN for static assets
|
|
422
|
-
- Implement database query logging in development
|
|
423
|
-
- Use pagination for large datasets
|
|
424
|
-
- Minimize middleware stack
|
|
425
|
-
- Use lazy loading for heavy resources
|
|
426
|
-
|
|
1
|
+
# PHP Web Applications Best Practices
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This guide provides best practices for developing PHP web applications using MVC architecture, modern frameworks (Laravel, Symfony), templating engines, and secure form handling.
|
|
6
|
+
|
|
7
|
+
## MVC Architecture
|
|
8
|
+
|
|
9
|
+
### Controllers
|
|
10
|
+
|
|
11
|
+
**Keep controllers thin** - Controllers should delegate business logic to services.
|
|
12
|
+
|
|
13
|
+
```php
|
|
14
|
+
<?php
|
|
15
|
+
|
|
16
|
+
namespace App\Controllers;
|
|
17
|
+
|
|
18
|
+
use App\Services\UserService;
|
|
19
|
+
use Symfony\Component\HttpFoundation\Request;
|
|
20
|
+
use Symfony\Component\HttpFoundation\Response;
|
|
21
|
+
|
|
22
|
+
class UserController
|
|
23
|
+
{
|
|
24
|
+
public function __construct(
|
|
25
|
+
private UserService $userService
|
|
26
|
+
) {}
|
|
27
|
+
|
|
28
|
+
public function index(): Response
|
|
29
|
+
{
|
|
30
|
+
// Thin controller - delegates to service
|
|
31
|
+
$users = $this->userService->getAllUsers();
|
|
32
|
+
|
|
33
|
+
return $this->render('users/index', [
|
|
34
|
+
'users' => $users
|
|
35
|
+
]);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public function store(Request $request): Response
|
|
39
|
+
{
|
|
40
|
+
// Validate and delegate
|
|
41
|
+
$validated = $this->validate($request, [
|
|
42
|
+
'name' => 'required|string|max:255',
|
|
43
|
+
'email' => 'required|email|unique:users'
|
|
44
|
+
]);
|
|
45
|
+
|
|
46
|
+
$user = $this->userService->createUser($validated);
|
|
47
|
+
|
|
48
|
+
return $this->redirect('/users/' . $user->id);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Models
|
|
54
|
+
|
|
55
|
+
**Models handle data logic** - Use Eloquent ORM or Doctrine for database interactions.
|
|
56
|
+
|
|
57
|
+
```php
|
|
58
|
+
<?php
|
|
59
|
+
|
|
60
|
+
namespace App\Models;
|
|
61
|
+
|
|
62
|
+
use Illuminate\Database\Eloquent\Model;
|
|
63
|
+
use Illuminate\Database\Eloquent\Relations\HasMany;
|
|
64
|
+
|
|
65
|
+
class User extends Model
|
|
66
|
+
{
|
|
67
|
+
protected $fillable = ['name', 'email', 'password'];
|
|
68
|
+
|
|
69
|
+
protected $hidden = ['password', 'remember_token'];
|
|
70
|
+
|
|
71
|
+
protected $casts = [
|
|
72
|
+
'email_verified_at' => 'datetime',
|
|
73
|
+
'is_active' => 'boolean'
|
|
74
|
+
];
|
|
75
|
+
|
|
76
|
+
// Relationships
|
|
77
|
+
public function posts(): HasMany
|
|
78
|
+
{
|
|
79
|
+
return $this->hasMany(Post::class);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Accessors
|
|
83
|
+
public function getFullNameAttribute(): string
|
|
84
|
+
{
|
|
85
|
+
return "{$this->first_name} {$this->last_name}";
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Scopes
|
|
89
|
+
public function scopeActive($query)
|
|
90
|
+
{
|
|
91
|
+
return $query->where('is_active', true);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Views
|
|
97
|
+
|
|
98
|
+
**Minimal logic in views** - Use template engines with auto-escaping.
|
|
99
|
+
|
|
100
|
+
```php
|
|
101
|
+
<!-- Blade Template (Laravel) -->
|
|
102
|
+
@extends('layouts.app')
|
|
103
|
+
|
|
104
|
+
@section('content')
|
|
105
|
+
<h1>{{ $title }}</h1>
|
|
106
|
+
|
|
107
|
+
@foreach($users as $user)
|
|
108
|
+
<div class="user-card">
|
|
109
|
+
<h2>{{ $user->name }}</h2>
|
|
110
|
+
<p>{{ $user->email }}</p>
|
|
111
|
+
|
|
112
|
+
@if($user->is_active)
|
|
113
|
+
<span class="badge badge-success">Active</span>
|
|
114
|
+
@else
|
|
115
|
+
<span class="badge badge-danger">Inactive</span>
|
|
116
|
+
@endif
|
|
117
|
+
</div>
|
|
118
|
+
@endforeach
|
|
119
|
+
@endsection
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Routing
|
|
123
|
+
|
|
124
|
+
### RESTful Routes
|
|
125
|
+
|
|
126
|
+
```php
|
|
127
|
+
<?php
|
|
128
|
+
|
|
129
|
+
use App\Controllers\UserController;
|
|
130
|
+
use Illuminate\Support\Facades\Route;
|
|
131
|
+
|
|
132
|
+
// RESTful resource routes
|
|
133
|
+
Route::resource('users', UserController::class);
|
|
134
|
+
|
|
135
|
+
// Generates:
|
|
136
|
+
// GET /users -> index()
|
|
137
|
+
// GET /users/create -> create()
|
|
138
|
+
// POST /users -> store()
|
|
139
|
+
// GET /users/{id} -> show()
|
|
140
|
+
// GET /users/{id}/edit -> edit()
|
|
141
|
+
// PUT /users/{id} -> update()
|
|
142
|
+
// DELETE /users/{id} -> destroy()
|
|
143
|
+
|
|
144
|
+
// Route model binding
|
|
145
|
+
Route::get('/users/{user}', function (User $user) {
|
|
146
|
+
return view('users.show', ['user' => $user]);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
// Route groups with middleware
|
|
150
|
+
Route::middleware(['auth', 'verified'])->group(function () {
|
|
151
|
+
Route::get('/dashboard', [DashboardController::class, 'index']);
|
|
152
|
+
Route::resource('posts', PostController::class);
|
|
153
|
+
});
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Template Engines
|
|
157
|
+
|
|
158
|
+
### Twig (Symfony)
|
|
159
|
+
|
|
160
|
+
```php
|
|
161
|
+
<?php
|
|
162
|
+
|
|
163
|
+
// Controller
|
|
164
|
+
return $this->render('user/profile.html.twig', [
|
|
165
|
+
'user' => $user,
|
|
166
|
+
'posts' => $posts
|
|
167
|
+
]);
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
```twig
|
|
171
|
+
{# Template: user/profile.html.twig #}
|
|
172
|
+
{% extends 'base.html.twig' %}
|
|
173
|
+
|
|
174
|
+
{% block title %}{{ user.name }} - Profile{% endblock %}
|
|
175
|
+
|
|
176
|
+
{% block content %}
|
|
177
|
+
<h1>{{ user.name }}</h1>
|
|
178
|
+
<p>{{ user.email }}</p>
|
|
179
|
+
|
|
180
|
+
{# Auto-escaping enabled by default #}
|
|
181
|
+
<div>{{ user.bio }}</div>
|
|
182
|
+
|
|
183
|
+
{# Raw output (use with caution) #}
|
|
184
|
+
<div>{{ user.html_content|raw }}</div>
|
|
185
|
+
|
|
186
|
+
{# Loops #}
|
|
187
|
+
{% for post in posts %}
|
|
188
|
+
<article>
|
|
189
|
+
<h2>{{ post.title }}</h2>
|
|
190
|
+
<p>{{ post.excerpt }}</p>
|
|
191
|
+
</article>
|
|
192
|
+
{% endfor %}
|
|
193
|
+
{% endblock %}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Blade (Laravel)
|
|
197
|
+
|
|
198
|
+
```php
|
|
199
|
+
{{-- Template inheritance --}}
|
|
200
|
+
@extends('layouts.app')
|
|
201
|
+
|
|
202
|
+
@section('title', 'User Profile')
|
|
203
|
+
|
|
204
|
+
@section('content')
|
|
205
|
+
<h1>{{ $user->name }}</h1>
|
|
206
|
+
|
|
207
|
+
{{-- Components --}}
|
|
208
|
+
<x-alert type="success">
|
|
209
|
+
Profile updated successfully!
|
|
210
|
+
</x-alert>
|
|
211
|
+
|
|
212
|
+
{{-- Directives --}}
|
|
213
|
+
@auth
|
|
214
|
+
<a href="/profile/edit">Edit Profile</a>
|
|
215
|
+
@endauth
|
|
216
|
+
|
|
217
|
+
@include('partials.user-stats', ['user' => $user])
|
|
218
|
+
@endsection
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Form Handling
|
|
222
|
+
|
|
223
|
+
### CSRF Protection
|
|
224
|
+
|
|
225
|
+
**Always use CSRF tokens** for forms.
|
|
226
|
+
|
|
227
|
+
```php
|
|
228
|
+
<!-- Blade -->
|
|
229
|
+
<form method="POST" action="/users">
|
|
230
|
+
@csrf
|
|
231
|
+
<input type="text" name="name" value="{{ old('name') }}">
|
|
232
|
+
<button type="submit">Submit</button>
|
|
233
|
+
</form>
|
|
234
|
+
|
|
235
|
+
<!-- Twig -->
|
|
236
|
+
<form method="post" action="{{ path('user_create') }}">
|
|
237
|
+
<input type="hidden" name="_token" value="{{ csrf_token('user_create') }}">
|
|
238
|
+
<input type="text" name="name">
|
|
239
|
+
<button type="submit">Submit</button>
|
|
240
|
+
</form>
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Form Validation
|
|
244
|
+
|
|
245
|
+
**Use dedicated validation classes** (Form Requests in Laravel).
|
|
246
|
+
|
|
247
|
+
```php
|
|
248
|
+
<?php
|
|
249
|
+
|
|
250
|
+
namespace App\Http\Requests;
|
|
251
|
+
|
|
252
|
+
use Illuminate\Foundation\Http\FormRequest;
|
|
253
|
+
|
|
254
|
+
class StoreUserRequest extends FormRequest
|
|
255
|
+
{
|
|
256
|
+
public function authorize(): bool
|
|
257
|
+
{
|
|
258
|
+
return $this->user()->can('create', User::class);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
public function rules(): array
|
|
262
|
+
{
|
|
263
|
+
return [
|
|
264
|
+
'name' => 'required|string|max:255',
|
|
265
|
+
'email' => 'required|email|unique:users,email',
|
|
266
|
+
'password' => 'required|min:8|confirmed',
|
|
267
|
+
'age' => 'nullable|integer|min:18|max:120',
|
|
268
|
+
'role' => 'required|in:user,admin,moderator'
|
|
269
|
+
];
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
public function messages(): array
|
|
273
|
+
{
|
|
274
|
+
return [
|
|
275
|
+
'name.required' => 'Please provide your name',
|
|
276
|
+
'email.unique' => 'This email is already registered',
|
|
277
|
+
'password.min' => 'Password must be at least 8 characters'
|
|
278
|
+
];
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// Controller usage
|
|
283
|
+
public function store(StoreUserRequest $request)
|
|
284
|
+
{
|
|
285
|
+
// Validation already passed
|
|
286
|
+
$validated = $request->validated();
|
|
287
|
+
|
|
288
|
+
$user = User::create($validated);
|
|
289
|
+
|
|
290
|
+
return redirect('/users')->with('success', 'User created!');
|
|
291
|
+
}
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### Displaying Validation Errors
|
|
295
|
+
|
|
296
|
+
```php
|
|
297
|
+
<!-- Blade -->
|
|
298
|
+
@if ($errors->any())
|
|
299
|
+
<div class="alert alert-danger">
|
|
300
|
+
<ul>
|
|
301
|
+
@foreach ($errors->all() as $error)
|
|
302
|
+
<li>{{ $error }}</li>
|
|
303
|
+
@endforeach
|
|
304
|
+
</ul>
|
|
305
|
+
</div>
|
|
306
|
+
@endif
|
|
307
|
+
|
|
308
|
+
<!-- Field-specific errors -->
|
|
309
|
+
<input type="text" name="email" value="{{ old('email') }}"
|
|
310
|
+
class="@error('email') is-invalid @enderror">
|
|
311
|
+
@error('email')
|
|
312
|
+
<span class="error">{{ $message }}</span>
|
|
313
|
+
@enderror
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
## Middleware
|
|
317
|
+
|
|
318
|
+
### Creating Middleware
|
|
319
|
+
|
|
320
|
+
```php
|
|
321
|
+
<?php
|
|
322
|
+
|
|
323
|
+
namespace App\Http\Middleware;
|
|
324
|
+
|
|
325
|
+
use Closure;
|
|
326
|
+
use Illuminate\Http\Request;
|
|
327
|
+
|
|
328
|
+
class CheckUserRole
|
|
329
|
+
{
|
|
330
|
+
public function handle(Request $request, Closure $next, string $role)
|
|
331
|
+
{
|
|
332
|
+
if (!$request->user() || !$request->user()->hasRole($role)) {
|
|
333
|
+
abort(403, 'Unauthorized action.');
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
return $next($request);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// Usage in routes
|
|
341
|
+
Route::middleware(['auth', 'role:admin'])->group(function () {
|
|
342
|
+
Route::get('/admin/dashboard', [AdminController::class, 'index']);
|
|
343
|
+
});
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
## Session Management
|
|
347
|
+
|
|
348
|
+
### Using Sessions
|
|
349
|
+
|
|
350
|
+
```php
|
|
351
|
+
<?php
|
|
352
|
+
|
|
353
|
+
// Store data
|
|
354
|
+
session(['key' => 'value']);
|
|
355
|
+
$request->session()->put('user_id', $user->id);
|
|
356
|
+
|
|
357
|
+
// Retrieve data
|
|
358
|
+
$value = session('key');
|
|
359
|
+
$userId = $request->session()->get('user_id');
|
|
360
|
+
|
|
361
|
+
// Flash data (available for next request only)
|
|
362
|
+
$request->session()->flash('status', 'Task was successful!');
|
|
363
|
+
|
|
364
|
+
// Regenerate session ID (after login)
|
|
365
|
+
$request->session()->regenerate();
|
|
366
|
+
|
|
367
|
+
// Destroy session (logout)
|
|
368
|
+
$request->session()->invalidate();
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
## Best Practices
|
|
372
|
+
|
|
373
|
+
### ✅ DO
|
|
374
|
+
|
|
375
|
+
- Use route model binding for automatic model injection
|
|
376
|
+
- Implement middleware for cross-cutting concerns (auth, logging, CORS)
|
|
377
|
+
- Use service classes for complex business logic
|
|
378
|
+
- Leverage dependency injection for testability
|
|
379
|
+
- Use database migrations for schema management
|
|
380
|
+
- Implement proper error handling and logging
|
|
381
|
+
- Use environment variables for configuration
|
|
382
|
+
- Enable HTTPS in production
|
|
383
|
+
- Implement rate limiting for public endpoints
|
|
384
|
+
- Use queues for long-running tasks
|
|
385
|
+
|
|
386
|
+
### ❌ DON'T
|
|
387
|
+
|
|
388
|
+
- Put business logic in controllers or views
|
|
389
|
+
- Use raw SQL queries without parameter binding
|
|
390
|
+
- Store sensitive data in sessions without encryption
|
|
391
|
+
- Disable CSRF protection
|
|
392
|
+
- Use `extract()` on user input
|
|
393
|
+
- Echo user input without escaping
|
|
394
|
+
- Use `eval()` or similar dangerous functions
|
|
395
|
+
- Hardcode credentials or API keys
|
|
396
|
+
- Ignore validation errors
|
|
397
|
+
- Use global variables for state management
|
|
398
|
+
|
|
399
|
+
## Security Checklist
|
|
400
|
+
|
|
401
|
+
- [ ] CSRF tokens on all forms
|
|
402
|
+
- [ ] Input validation on all user data
|
|
403
|
+
- [ ] Output escaping in all views
|
|
404
|
+
- [ ] Prepared statements for database queries
|
|
405
|
+
- [ ] HTTPS enforced in production
|
|
406
|
+
- [ ] Secure session configuration (httponly, secure flags)
|
|
407
|
+
- [ ] Password hashing with bcrypt/argon2
|
|
408
|
+
- [ ] Rate limiting on authentication endpoints
|
|
409
|
+
- [ ] SQL injection prevention
|
|
410
|
+
- [ ] XSS prevention
|
|
411
|
+
- [ ] File upload validation
|
|
412
|
+
- [ ] Proper error handling (don't expose stack traces)
|
|
413
|
+
|
|
414
|
+
## Performance Tips
|
|
415
|
+
|
|
416
|
+
- Use eager loading to avoid N+1 queries
|
|
417
|
+
- Implement caching for frequently accessed data
|
|
418
|
+
- Use database indexes on frequently queried columns
|
|
419
|
+
- Optimize images and assets
|
|
420
|
+
- Enable OPcache in production
|
|
421
|
+
- Use CDN for static assets
|
|
422
|
+
- Implement database query logging in development
|
|
423
|
+
- Use pagination for large datasets
|
|
424
|
+
- Minimize middleware stack
|
|
425
|
+
- Use lazy loading for heavy resources
|
|
426
|
+
|