Skip to content

Web: phpc.json assets directory served beside public docroot (003-MiniWebApp /assets/) #594

@PurHur

Description

@PurHur

Problem

examples/003-MiniWebApp/templates/layout.php links /assets/style.css, but files live in examples/003-MiniWebApp/assets/outside the public/ docroot (phpc.json "public": "public").

DevServer::resolveDocrootFile() only maps URLs under public/, so GET /assets/style.css returns 404 during phpc serve even when HTML routes are green (#539). Production deploy (#180) needs the same asset tree beside the binary.

Goal

Manifest field (proposed "assets": "assets") or documented convention:

{
  "entry": "public/index.php",
  "public": "public",
  "assets": "assets",
  "binary": ".phpc/bin/app"
}

phpc serve and phpc serve --aot resolve /assets/* from the project assets/ directory (with path traversal guards matching DevServer::isSafeUrlPath).

Scope

Acceptance criteria

cd examples/003-MiniWebApp
../../phpc serve 127.0.0.1:8080 .
curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:8080/assets/style.css
# → 200

Docker:

docker run --rm -v "$(pwd):/compiler" -w /compiler php-compiler:22.04-dev \
  bash -lc 'cd examples/003-MiniWebApp && ../../phpc serve 127.0.0.1:18080 . & sleep 1; curl -sf http://127.0.0.1:18080/assets/style.css | head -1'

No GitHub Actions required.

Dependencies

Links

  • ROADMAP #78 Phase 3 Web runtime
  • Layout: examples/003-MiniWebApp/templates/layout.php
  • Related: #277 static CSS in ServeAotTest (flat examples)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions