• M5: Add ServiceProviderInterface and ProviderRepository; integrate providers into Kernel (register before container build, boot after); add RouteRegistry with clear(); add default core providers (Routing, Template, ORM, Flags, Testing) and AppServiceProvider; add contracts and default drivers (Template/Eyrie, Orm/Pairity, Flags/Flagpole, Testing/Codeception) • Routing: allow providers to contribute routes; add ProviderRouteTest • Config: add config/providers.php; extend config/app.php with driver keys; document env keys • M6: Introduce MVC bases: Controller, APIController (JSON helpers), ViewController (html + renderView helpers), View (transformData + renderer); add ViewWithDefaultTemplate and default-template flow; adjust method signatures to data-first and delegate template override to View • HTTP: Add UrlExtensionNegotiationMiddleware (opt-in via URL_EXTENSION_NEGOTIATION, whitelist via URL_EXTENSION_WHITELIST with default json|php|none); wire before ContentNegotiationMiddleware • Tests: add UrlExtensionNegotiationTest and MvcViewTest; ensure RouteRegistry::clear prevents duplicate routes in tests • Docs: Update README with M5 provider usage, M6 MVC examples and template selection conventions, and URL extension negotiation; mark M5 complete in MILESTONES; add M12 task to provide XML support and enable xml in whitelist by default
33 lines
939 B
PHP
33 lines
939 B
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
namespace Phred\Tests;
|
|
|
|
use Phred\Mvc\View;
|
|
use Phred\Template\EyrieRenderer;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
final class MvcViewTest extends TestCase
|
|
{
|
|
public function testViewTransformsDataAndRenders(): void
|
|
{
|
|
$renderer = new EyrieRenderer();
|
|
$view = new class($renderer) extends View {
|
|
protected function transformData(array $data): array
|
|
{
|
|
$data['name'] = strtoupper($data['name'] ?? '');
|
|
return $data;
|
|
}
|
|
};
|
|
|
|
// Set default template and render using data-first signature
|
|
$ref = new \ReflectionClass($view);
|
|
$prop = $ref->getParentClass()->getProperty('template');
|
|
$prop->setAccessible(true);
|
|
$prop->setValue($view, '<h1>Hello {{name}}</h1>');
|
|
|
|
$html = $view->render(['name' => 'world']);
|
|
$this->assertSame('<h1>Hello WORLD</h1>', $html);
|
|
}
|
|
}
|