Enable Discovery debug logging for production troubleshooting
- Add DISCOVERY_LOG_LEVEL=debug - Add DISCOVERY_SHOW_PROGRESS=true - Temporary changes for debugging InitializerProcessor fixes on production
This commit is contained in:
@@ -8,9 +8,13 @@ use App\Framework\Core\PathProvider;
|
||||
use App\Framework\DI\DefaultContainer;
|
||||
use App\Framework\Http\Headers;
|
||||
use App\Framework\Http\HttpResponse;
|
||||
use App\Framework\Http\Request;
|
||||
use App\Framework\Http\Response;
|
||||
use App\Framework\Http\Responses\JsonResponse;
|
||||
use App\Framework\Http\Responses\RedirectResponse;
|
||||
use App\Framework\Http\Responses\SseResponse;
|
||||
use App\Framework\Http\Responses\WebSocketResponse;
|
||||
use App\Framework\Http\Uri;
|
||||
use App\Framework\Router\Result\FileResult;
|
||||
use App\Framework\Router\Result\JsonResult;
|
||||
use App\Framework\Router\Result\Redirect;
|
||||
@@ -20,7 +24,6 @@ use App\Framework\Router\Result\WebSocketResult;
|
||||
use App\Framework\View\RenderContext;
|
||||
use App\Framework\View\Template;
|
||||
use App\Framework\View\TemplateRenderer;
|
||||
use App\Framework\View\TemplateRendererInitializer;
|
||||
|
||||
final readonly class RouteResponder
|
||||
{
|
||||
@@ -28,36 +31,42 @@ final readonly class RouteResponder
|
||||
private PathProvider $pathProvider,
|
||||
private DefaultContainer $container,
|
||||
private TemplateRenderer $templateRenderer,
|
||||
) {}
|
||||
private Request $request,
|
||||
) {
|
||||
}
|
||||
|
||||
public function getContext(ViewResult $result): RenderContext
|
||||
{
|
||||
return new RenderContext(
|
||||
template: $result->model ? $this->resolveTemplate($result->model) : $result->template,
|
||||
metaData: $result->metaData,
|
||||
data: $result->model ? get_object_vars($result->model) + $result->data : $result->data,
|
||||
layout: '',
|
||||
slots: $result->slots,
|
||||
isPartial: $this->isSpaRequest(),
|
||||
);
|
||||
}
|
||||
|
||||
public function respond(Response|ActionResult $result): Response
|
||||
{
|
||||
if($result instanceof Response) {
|
||||
if ($result instanceof Response) {
|
||||
return $result;
|
||||
}
|
||||
|
||||
if ($this->isSpaRequest() && $result instanceof ViewResult) {
|
||||
return $this->createSpaResponse($result);
|
||||
}
|
||||
|
||||
return match(true) {
|
||||
$result instanceof ViewResult => new HttpResponse(
|
||||
status: $result->status,
|
||||
body: $this->renderTemplate(
|
||||
new RenderContext(
|
||||
template: $result->model ? $this->resolveTemplate($result->model) : $result->template,
|
||||
metaData: $result->metaData,
|
||||
data: $result->model ? get_object_vars($result->model) + $result->data : $result->data,
|
||||
layout: '',
|
||||
slots: $result->slots
|
||||
)
|
||||
)
|
||||
body: $this->renderTemplate($this->getContext($result))
|
||||
),
|
||||
$result instanceof JsonResult => new HttpResponse(
|
||||
$result instanceof JsonResult => new JsonResponse(
|
||||
body : $result->data,
|
||||
status : $result->status,
|
||||
headers: new Headers()->with('Content-Type', 'application/json'),
|
||||
body : json_encode($result->data),
|
||||
),
|
||||
$result instanceof Redirect => new HttpResponse(
|
||||
status: $result->status,
|
||||
headers: new Headers()->with('Location', $result->target)
|
||||
),
|
||||
$result instanceof Redirect => new RedirectResponse(new Uri($result->target)),
|
||||
$result instanceof SseResult => new SseResponse($result, $result->callback),
|
||||
$result instanceof WebSocketResult => $this->createWebSocketResponse($result),
|
||||
$result instanceof FileResult => new HttpResponse(
|
||||
@@ -82,9 +91,40 @@ final readonly class RouteResponder
|
||||
return $this->templateRenderer->render($context);
|
||||
}
|
||||
|
||||
private function resolveTemplate(?object $model):string
|
||||
private function isSpaRequest(): bool
|
||||
{
|
||||
if($model === null) {
|
||||
$xmlHttpRequest = $this->request->headers->getFirst('X-Requested-With');
|
||||
$hasSpaRequest = $this->request->headers->has('X-SPA-Request');
|
||||
|
||||
// Fallback: Direkt aus $_SERVER lesen (für Nginx FastCGI)
|
||||
if (empty($xmlHttpRequest)) {
|
||||
$xmlHttpRequest = $_SERVER['HTTP_X_REQUESTED_WITH'] ?? '';
|
||||
}
|
||||
|
||||
if (! $hasSpaRequest) {
|
||||
$hasSpaRequest = ! empty($_SERVER['HTTP_X_SPA_REQUEST']);
|
||||
}
|
||||
|
||||
return $xmlHttpRequest === 'XMLHttpRequest' && $hasSpaRequest;
|
||||
}
|
||||
|
||||
private function createSpaResponse(ViewResult $result): JsonResponse
|
||||
{
|
||||
$context = $this->getContext($result);
|
||||
|
||||
return new JsonResponse([
|
||||
'html' => $this->templateRenderer->renderPartial($context),
|
||||
'title' => $result->metaData->title ?? '',
|
||||
'meta' => [
|
||||
'description' => $result->metaData->description ?? '',
|
||||
// Add other meta data as needed
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
private function resolveTemplate(?object $model): string
|
||||
{
|
||||
if ($model === null) {
|
||||
return 'test';
|
||||
}
|
||||
|
||||
@@ -97,6 +137,7 @@ final readonly class RouteResponder
|
||||
|
||||
/** @var Template $attr */
|
||||
$attr = $attrs[0]->newInstance();
|
||||
|
||||
return $attr->path;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user