A task and project management system built on a custom MVC framework in PHP 8.1, written to practise Clean Architecture: the domain layer holds entities and repository interfaces, the application layer holds use cases, and PDO implementations live in infrastructure. Nothing in the domain knows about HTTP or MySQL.
This is a learning and portfolio project, and it is honest about where it stands. The
architecture and the application layer are real, and the auth, dashboard, kanban, calendar and
settings views exist, added after issue #5 was filed. Two gaps are tracked in the open issues rather than hidden:
#5 — resources/lang/ is empty, so
Language::get() falls through and returns the raw key, which makes the fr/en/ar switcher inert —
and #2 — PHPUnit reports 0% over
1,168 lines while CI is green.
Read it for the architecture and the use-case layer. Do not deploy it.
app/
├── Application/ # Use cases (business logic orchestration)
├── Core/ # Shared services (i18n)
├── Domain/ # Entities and repository interfaces
├── Http/ # Controllers, middleware, request/response, routing
└── Infrastructure/ # Database repositories (PDO)
bootstrap/ # Application bootstrap
config/ # (reads from .env via Dotenv)
database/ # Migration scripts
public/ # Web root (entry point: index.php)
resources/ # Views, translations
routes/ # Route definitions
storage/ # Cache, logs, sessions, uploads
tests/ # PHPUnit tests
- PHP >= 8.1
- MySQL >= 5.7
- Apache with mod_rewrite (or PHP built-in server)
- Composer
git clone https://github.com/WAHIB-EL-KHADIRI/taskflow-pro.git
cd taskflow-pro
cp .env.example .env
composer install
php database/migrate.php seed
php -S localhost:8000 -t public/Copy .env.example to .env and configure:
| Variable | Description | Default |
|---|---|---|
APP_ENV |
development or production |
production |
APP_DEBUG |
Verbose error output | false |
DB_HOST |
MySQL host | 127.0.0.1 |
DB_DATABASE |
Database name | taskflow_pro |
DB_USERNAME |
DB user | root |
DB_PASSWORD |
DB password | (empty) |
composer start # Start dev server
composer test # Run PHPUnit
composer lint # Check PSR-12 style
composer analyse # PHPStan static analysis
php database/migrate.php refresh seed # Reset DB with seed dataMIT