PHP 8.3 app using Doctrine ORM, Slim 4, PostgreSQL/PostGIS. Frontend: pnpm workspaces.
# Docker Compose (Recommended)
cd dev/
./start.sh # Start containers (app, db, mailhog)
./bash.sh # Shell into container
./psql.sh # Connect to PostgreSQL
./shell.sh # PHP interactive shell (psysh)
./pnpm.sh <cmd> # Run pnpm commands
# Skaffold + K8s (Infrastructure)
skaffold dev # Hot-reload dev mode
skaffold run # Deploy to clusterAccess: http://localhost (port 80)
composer install # PHP dependencies
composer dump-autoload # Regenerate autoloader
cd src/
pnpm install # Install workspace deps
pnpm run build # Build all assets
pnpm run dev # Dev build with source maps
pnpm run watch # Watch mode# Run all tests
vendor/bin/phpunit tests/
# Single test file
vendor/bin/phpunit tests/src/EntitiesTest.php
# Single test method
vendor/bin/phpunit tests/src/EntitiesTest.php --filter testAgentCreation
# Inside container
./scripts/run-tests-docker.shTest Structure: Tests extend Tests\Abstract\TestCase. Each test runs in DB transaction (auto-rollback). Builders in tests/src/Builders/, Directors in tests/src/Directors/.
- PHP 8.3+ with
declare(strict_types=1); - Namespaces: PSR-4 autoloading
MapasCulturais\→src/core/MapasCulturais\Modules\→src/modules/MapasCulturais\Themes\→src/themes/Tests\→tests/
- Classes: PascalCase (
AgentController,UserBuilder) - Methods: camelCase (
getAgentById,createUser) - Properties: camelCase (
$entityManager,$validationErrors) - Constants: UPPER_SNAKE_CASE (
STATUS_ENABLED,STATUS_DRAFT) - Files: Match class name
Entity::STATUS_ENABLED = 1
Entity::STATUS_DRAFT = 0
Entity::STATUS_DISABLED = -9
Entity::STATUS_TRASH = -10
Entity::STATUS_ARCHIVED = -2use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
#[ORM\Table(name: 'agent')]
class Agent extends Entity { }Use typed exceptions from MapasCulturais\Exceptions\:
PermissionDenied- access controlNotFound- missing entitiesWorkflowRequest- workflow state issues
$app->hook('entity(Agent).save:before', function() { });
$app->hook('entity.insert:after', function() { });- PHP built-in classes
- Doctrine classes
- Slim/PSR classes
- Symfony components
- MapasCulturais core classes
- Application-specific classes
# Apply DB updates
./scripts/db-update.sh
# Restore from dump
./scripts/restore-dump.sh -db=mapas -u=mapas -f=dump.sqlMigrations in db-updates.php (auto-applied on container start via entrypoint.sh).
src/
core/ # Core framework (App, Entity, Controller)
modules/ # Feature modules
themes/ # UI themes (BaseV1, BaseV2)
conf/ # Configuration loader
tools/ # CLI tools (apply-updates.php)
config/ # Config files
public/ # Web root
scripts/ # Shell scripts
tests/ # PHPUnit tests
helm/ # Helm chart
dev/ # Docker Compose env
docker/ # Docker config
- Main:
config/(merged at runtime) - Dev overrides:
dev/config.d/ - Environment via
env()function - Key vars:
DB_HOST,DB_NAME,DB_USER,DB_PASS,REDIS_CACHE
- Set
APP_DEBUG=true - Logs:
var/logs/app.log - Use
dump()ordd()for debugging - PHP shell:
dev/shell.sh(psysh)