# Phred A PHP MVC framework: * Intended for projects of all sizes, and solo or team development. * The single router call per controller style makes it easy for teamwork without stepping on each others toes. * REQUIREMENTS * PHP 8.1+ * Primarily meant for Apache/Nginx webservers, will look into supporting other webservers in the future. * PSR-4 autoloading. * Installed through Composer (`composer create-project getphred/phred`) * Environment variables (.env) for configuration. * Supports two API formats * pragmatic REST (default) * JSON:API * Choose via .env: * `API_FORMAT=rest` (plain JSON responses, RFC7807 error format.) * `API_FORMAT=jsonapi` (JSON:API compliant documents and error objects.) * You may also negotiate per request using the `Accept` header. * TESTING environment variables (.env) * `TEST_RUNNER=codeception` * `TEST_PATH=tests` * `TEST_PATH` is relative to both project root and each module root. * Dependency Injection * Fully Pluggable, but ships with defaults: * Pluggability model * Core depends on Phred contracts (`Phred\Contracts\*`) and PSRs * Concrete implementations are provided by Service Providers. * Swap packages by changing `.env` and enabling a provider. * Driver keys (examples) * `ORM_DRIVER=pairity|doctrine` * `TEMPLATE_DRIVER=eyrie|twig|plates` * `FLAGS_DRIVER=flagpole|unleash` * `TEST_RUNNER=codeception` * Primary contracts * `Template\RendererInterface` * `Orm\EntityManagerInterface` (or repositories) * `Flags\FeatureFlagClientInterface` * `Testing\TestRunnerInterface`. * Default Plug-ins * Feature Flags through `getphred/flagpole` * ORM through `getphred/pairity` (handles migrations, seeds, and db access) * Unit Testing through `codeception/codeception` * Testing is provided as a CLI dev capability only; it is not part of the HTTP request lifecycle. * Template Engine through `getphred/eyrie` * Other dependencies: * Dependency Injection through `php-di/php-di` * Static Analysis through `phpstan/phpstan` * Code Style Enforcement through `friendsofphp/php-cs-fixer` * Logging through `monolog/monolog` * Config and environment handling through `vlucas/phpdotenv` * HTTP client through `guzzlehttp/guzzle` * CONTROLLERS * Invokable controllers (Actions), * Single router call per controller, * `public function __invoke(Request $request)` method entry point on controller class, * VIEWS * Classes for data manipulation/preparation before rendering Templates, * `$this->render(, );` to render a template. * SERVICES * for business logic. * SERVICE PROVIDERS * for dependency injection. * MIGRATIONS * for database changes. * Modular separation, similar to Django apps. * Nested Models * Nested Controllers * Nested Views * Nested Services * Nested Migrations * Nested Service Providers * Nested Routes * Nested Templates * Nested Tests * CLI Helper called phred * `php phred create:command ` // Creates a CLI command under `console/commands * `php phred create:module ` // Creates a module * `php phred create::controller` // Creates a controller in the specified module * `php phred create::model` // Creates a model in the specified module * `php phred create::migration` // Creates a migration in the specified module * `php phred create::seed` // Creates a seeder in the specified module * `php phred create::test` // Creates a test in the specified module * `php phred create::view` / Creates a view in the specified module * `php phred db:backup` // Backup the database * `php phred db:restore -f ` // Restore the database from the specified backup file * `php phred migrate [-m ]` // Migrate entire project or module * `php phred migration:rollback [-m ]` // Rollback entire project or module * `php phred seed` * `php phred seed:rollback` * `php phred test[:]` // Test entire project or module * Runs tests using the configured test runner (dev only). * Requires `require-dev` dependencies. * `php phred run [-p ]` * Spawns a local PHP webserver on port 8000 (unless specified otherwise using `-p`) * CLI Helper is extendable through CLI Commands. Command discovery * Core commands (bundled with Phred) are discovered from `src/commands`. * User/project commands are discovered from `console/commands` in your project root. Run the CLI: ``` php phred list ``` Add your own command by creating a PHP file under `console/commands`, returning an instance of `Phred\Console\Command` (or an anonymous class extending it). (Or by running `php phred create:command `) Example: ``` writeln('Hello!'); return 0; } }; ```