Hallo zusammen,
ich habe leider generell noch keine Erfahrungen mit Contao, beschäftige mich aber gerade damit ein altes System auf eine neue Version zu aktualisieren. Das funktioniert soweit ganz gut, bis ich an die Stelle kam, an der externe PHP-Skripte in das System eingebunden werden sollen. In 4.9 schnappt sich durch die .htaccess Rewrite Regeln die index.php alle Skriptaufrufe, so dass bisherige extern liegende Skripte nicht mehr aufrufbar sind. Ich könnte jetzt natürlich einfach diese .htaccess-Datei bearbeiten und meine paar Skripte wieder aufrufbar machen, aber ich vermute dass das ein Update nicht überlebt. Da ich grundsätzlich auch ein wenig Symfony-Erfahrung habe, dachte ich dass es nicht so schwer sein kann dies korrekt umzusetzen. Aber da habe ich leider falsch gedacht.
Ich habe nun testweise also einen neuen Controller angelegt:
PHP-Code:
<?php declare(strict_types=1);
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
class PdfReader extends \Contao\Controller
{
public function __construct()
{
parent::__construct();
}
public function showPdf(string $id): Response
{
die('Hello World');
}
}
Und dann im Verzeichnis config/ eine routing.yml hinzugefügt (die war noch nicht vorhanden, laut Handbuch müsste sie aber wohl dort liegen):
Code:
helloworld:
path: /helloworld
defaults:
_controller: App\Controller\PdfReader::showPdf
_scope: frontend
_token_check: false
methods: [GET]
Das liefert soweit aber nur eine Fehlermeldung im Browser, weil der Controller nicht geladen werden konnte. Das kann ich soweit auch noch beheben, indem ich auch eine services.yml für Symfony anlege (die ebenfalls fehlte):
Code:
# config/services.yaml
services:
# default configuration for services in *this* file
_defaults:
autowire: true # Automatically injects dependencies in your services.
autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
# makes classes in src/ available to be used as services
# this creates a service per class whose id is the fully-qualified class name
App\:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
# controllers are imported separately to make sure services can be injected
# as action arguments even if you don't extend any base controller class
App\Controller\:
resource: '../src/Controller'
tags: ['controller.service_arguments']
App\Controller\PdfReader:
tags: ['controller.service_arguments']
An dieser Stelle komme ich nun gefühlt weiter, es wird die Route und der Controller gefunden und scheinbar auch aufgerufen, aber - wenn ich die Fehlermeldung die ich nun erhalte richtig interpretiere - ist der Dependency Injection Container von Symfony nicht korrekt befüllt bzw. gar nicht vorhanden:
Code:
[2020-06-27 12:09:13] request.INFO: Matched route "helloworld". {"route":"helloworld","route_parameters":{"_route":"helloworld","_controller":"App\\Controller\\PdfReader::showPdf","_scope":"frontend","_token_check":false},"request_uri":"http://example.com/helloworld","method":"GET"} []
[2020-06-27 12:09:13] security.INFO: Populated the TokenStorage with an anonymous Token. [] []
[2020-06-27 12:09:13] request.CRITICAL: Uncaught PHP Exception Error: "Call to a member function has() on null" at /var/www/example/html/contao_49/vendor/contao/core-bundle/src/Resources/contao/library/Contao/System.php line 167 {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowableError(code: 0): Call to a member function has() on null at /var/www/example/html/contao_49/vendor/contao/core-bundle/src/Resources/contao/library/Contao/System.php:167)"} []
Habe ich hier etwas falsch konfiguriert? Gibt es irgendwo Informationen wie diese Konfigurationsdateien aussehen sollten?
Lesezeichen