Files

48 lines
1.1 KiB
JSON
Raw Permalink Normal View History

Phase 3 sub-commit 3: examples/todo POC app, built via the makers Standalone Composer/CMake project under examples/todo/ derived from the skeleton, demonstrating every Phase 3 architectural primitive in a non-trivial app. All cross-side wiring is maker-generated; no handwritten bridge glue. Generated and customised: - src/Entity/Todo.php — make:bridge:resource Todo (UUIDv7 id) - src/Controller/TodoController.php — make:bridge:resource Todo (CRUD) - src/Controller/MarkAllDoneController.php — make:bridge:command MarkAllDone, body filled in to flip done=true on every row - qml/TodoList.qml — make:bridge:resource Todo (starter ListView) - qml/TodoWindow.qml — make:bridge:window Todo, body customised to embed a read-only mirror of the same ReactiveListModel The Phase 1 ping demo is dropped from this app — it doesn't fit the todo flow and nothing in Main.qml references it. Main.qml is the real list UI: - Add input + button (POST /api/todos with optimistic-friendly key). - Per-row CheckBox + delete button (PATCH/DELETE via todoModel.invoke() with `pending` role driving opacity). - "Mark all done" button (POST /api/mark-all-done). - "Open second window" button (Component { TodoWindow {} } pattern). Build / run delegated to the same Makefile shape as the skeleton, with SCRIPT_DIR/QT_BIN updated for the renamed binary (build/qml/todo). composer.json's path repo points at ../../../framework/php (one level deeper than the skeleton's path repo). Verified end-to-end with offscreen QPA: POST/PATCH/DELETE on /api/todos all round-trip, /api/mark-all-done flips every row, Mercure dual- publishes on every change. Clean shutdown. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 15:22:36 +02:00
{
"type": "project",
"license": "proprietary",
"minimum-stability": "stable",
"require": {
"php": "^8.4",
Phase 3 sub-commit 3: examples/todo POC app, built via the makers Standalone Composer/CMake project under examples/todo/ derived from the skeleton, demonstrating every Phase 3 architectural primitive in a non-trivial app. All cross-side wiring is maker-generated; no handwritten bridge glue. Generated and customised: - src/Entity/Todo.php — make:bridge:resource Todo (UUIDv7 id) - src/Controller/TodoController.php — make:bridge:resource Todo (CRUD) - src/Controller/MarkAllDoneController.php — make:bridge:command MarkAllDone, body filled in to flip done=true on every row - qml/TodoList.qml — make:bridge:resource Todo (starter ListView) - qml/TodoWindow.qml — make:bridge:window Todo, body customised to embed a read-only mirror of the same ReactiveListModel The Phase 1 ping demo is dropped from this app — it doesn't fit the todo flow and nothing in Main.qml references it. Main.qml is the real list UI: - Add input + button (POST /api/todos with optimistic-friendly key). - Per-row CheckBox + delete button (PATCH/DELETE via todoModel.invoke() with `pending` role driving opacity). - "Mark all done" button (POST /api/mark-all-done). - "Open second window" button (Component { TodoWindow {} } pattern). Build / run delegated to the same Makefile shape as the skeleton, with SCRIPT_DIR/QT_BIN updated for the renamed binary (build/qml/todo). composer.json's path repo points at ../../../framework/php (one level deeper than the skeleton's path repo). Verified end-to-end with offscreen QPA: POST/PATCH/DELETE on /api/todos all round-trip, /api/mark-all-done flips every row, Mercure dual- publishes on every change. Clean shutdown. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 15:22:36 +02:00
"symfony/framework-bundle": "^8.0",
"symfony/runtime": "^8.0",
"symfony/dotenv": "^8.0",
"symfony/yaml": "^8.0",
"symfony/security-bundle": "^8.0",
"symfony/mercure-bundle": "^0.4",
"symfony/uid": "^8.0",
v0.2.0 (4/N): make:bridge:resource --with-dto + symfony/validator Closes the input-validation gap that was the audit's headline finding. The legacy generated controller's `if (isset($data['title']))…` body accepted any JSON: empty title slipped through, malformed JSON got swallowed by `?? []`, wrong types were silently coerced via casts. The --with-dto flag generates: - src/Dto/Create<Name>Dto.php — readonly DTO with #[Assert\NotBlank] on title and #[Assert\Length(max: 255)] - src/Dto/Update<Name>Dto.php — same DTO with all fields nullable so PATCH callers send only what changed - src/Controller/<Name>Controller.php — same shape as the legacy controller but actions dispatch via #[MapRequestPayload] Validation failures (missing required field, wrong type, malformed JSON, oversize string) become RFC 7807 application/problem+json automatically — Symfony's RequestPayloadValueResolver does the work. No `if-isset` boilerplate, no silent coercion. Behaviour: - --with-dto is opt-in; legacy template still ships unchanged - audit suggests flipping to default-on once stable; that's a follow-up - maker fails loud (composer require hint) if symfony/validator isn't autoloadable - skeleton + example/todo composer.json pull symfony/validator so scaffolded apps work out of the box Snapshot test exercises both modes (legacy + --with-dto). New baselines TodoControllerWithDto.php / CreateTodoDto.php / UpdateTodoDto.php under tests/snapshot/. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 20:10:52 +02:00
"symfony/validator": "^8.0",
Phase 3 sub-commit 3: examples/todo POC app, built via the makers Standalone Composer/CMake project under examples/todo/ derived from the skeleton, demonstrating every Phase 3 architectural primitive in a non-trivial app. All cross-side wiring is maker-generated; no handwritten bridge glue. Generated and customised: - src/Entity/Todo.php — make:bridge:resource Todo (UUIDv7 id) - src/Controller/TodoController.php — make:bridge:resource Todo (CRUD) - src/Controller/MarkAllDoneController.php — make:bridge:command MarkAllDone, body filled in to flip done=true on every row - qml/TodoList.qml — make:bridge:resource Todo (starter ListView) - qml/TodoWindow.qml — make:bridge:window Todo, body customised to embed a read-only mirror of the same ReactiveListModel The Phase 1 ping demo is dropped from this app — it doesn't fit the todo flow and nothing in Main.qml references it. Main.qml is the real list UI: - Add input + button (POST /api/todos with optimistic-friendly key). - Per-row CheckBox + delete button (PATCH/DELETE via todoModel.invoke() with `pending` role driving opacity). - "Mark all done" button (POST /api/mark-all-done). - "Open second window" button (Component { TodoWindow {} } pattern). Build / run delegated to the same Makefile shape as the skeleton, with SCRIPT_DIR/QT_BIN updated for the renamed binary (build/qml/todo). composer.json's path repo points at ../../../framework/php (one level deeper than the skeleton's path repo). Verified end-to-end with offscreen QPA: POST/PATCH/DELETE on /api/todos all round-trip, /api/mark-all-done flips every row, Mercure dual- publishes on every change. Clean shutdown. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 15:22:36 +02:00
"doctrine/orm": "^3.0",
"doctrine/doctrine-bundle": "^3.0",
"doctrine/doctrine-migrations-bundle": "^4.0",
"php-qml/bridge": "@dev"
},
"require-dev": {
"symfony/maker-bundle": "^1.62"
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
"config": {
"allow-plugins": {
"symfony/runtime": true
}
},
"extra": {
"runtime": {
"class": "Symfony\\Component\\Runtime\\SymfonyRuntime"
}
},
"repositories": [
{
"type": "path",
"url": "../../../framework/php",
"options": {
"symlink": true
}
}
]
}