Hallo zusammen,
ich versuche gerade anhand der Dokumentation einen Hook über Invokable Services einzubinden.
https://docs.contao.org/dev/framewor...kable-services
Ich habe inzwischen mehrere Stunden damit verbracht. Dateinamen und Codeschnipsel zu prüfen, den Cache zu leeren und meine Testerweiterung neu zu installieren. Inzwischen bin ich mit meinem Latein am Ende und auf externe Hilfe angewiesen.
Die Erweiterung ist für den ersten Schritt möglichst einfach konzipiert. Im Grunde geht es im ersten Schritt lediglich darum, den Hook zu laden.
Über die composer.json lade ich automatisch alle Klassen im src-Ordner.
/composer.json
Code:
{
"name":"bohnmedia/multipage-bundle",
"description":"Split page into multiple subpages and assign articles",
"keywords":["contao","page","article"],
"type":"contao-bundle",
"homepage":"https://bohn.media",
"license":"MIT",
"authors":[
{
"name":"bohn.media",
"homepage":"https://bohn.media",
"role":"Developer"
}
],
"require": {
"contao/core-bundle":">=4.9"
},
"require-dev": {
"contao/manager-plugin": "^2.0"
},
"conflict": {
"contao/core": "*",
"contao/manager-plugin": "<2.0 || >=3.0"
},
"extra": {
"contao-manager-plugin": "BohnMedia\\MultiPageBundle\\ContaoManager\\Plugin"
},
"autoload":{
"psr-4": {
"BohnMedia\\MultiPageBundle\\": "src/"
}
}
}
src/MultiPageBundle.php
PHP-Code:
<?php
namespace BohnMedia\MultiPageBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class MultiPageBundle extends Bundle
{
}
src/ContaoManager/Plugin.php
PHP-Code:
<?php
namespace BohnMedia\MultiPageBundle\ContaoManager;
use Contao\CoreBundle\ContaoCoreBundle;
use Contao\ManagerPlugin\Bundle\BundlePluginInterface;
use Contao\ManagerPlugin\Bundle\Config\BundleConfig;
use Contao\ManagerPlugin\Bundle\Parser\ParserInterface;
use BohnMedia\MultiPageBundle\MultiPageBundle;
class Plugin implements BundlePluginInterface
{
/**
* {@inheritdoc}
*/
public function getBundles(ParserInterface $parser)
{
return [
BundleConfig::create(MultiPageBundle::class)
->setLoadAfter([ContaoCoreBundle::class]),
];
}
}
Die Services werden aus der Datei "/src/Resources/config/services.yml" geladen.
/src/DependencyInjection/MultiPageExtension.php
PHP-Code:
<?php
namespace BohnMedia\MultiPageBundle\DependencyInjection;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
class MultiPageExtension extends Extension
{
/**
* {@inheritdoc}
*/
public function load(array $mergedConfig, ContainerBuilder $container)
{
$loader = new YamlFileLoader(
$container,
new FileLocator(__DIR__.'/../Resources/config')
);
$loader->load('services.yml');
}
}
Hier definiere ich die Datei, über die der Hook geladen werden soll.
/src/Resources/config/services.yml
Code:
services:
_instanceof:
Contao\CoreBundle\Framework\FrameworkAwareInterface:
calls:
- ["setFramework", ["@contao.framework"]]
Symfony\Component\DependencyInjection\ContainerAwareInterface:
calls:
- ["setContainer", ["@service_container"]]
BohnMedia\MultiPageBundle\EventListener\InitializeSystemListener:
tags:
- { name: contao.hook, hook: initializeSystem }
Laut Dokumentation wird automatisch die Funktion "__invoke" verwendet, wenn unter "tags" der Wert "name" auf "contao.hook" gesetzt wird und die Methode weg gelassen wird. Die Funktion trägt wie in der Dokumentation beschrieben den Namen "__invoke" und Annotations wurden definiert.
/src/EventListener/InitializeSystemListener.php
PHP-Code:
<?php
namespace BohnMedia\MultiPageBundle\EventListener;
use Contao\CoreBundle\ServiceAnnotation\Hook;
/**
* @Hook("initializeSystem")
*/
class InitializeSystemListener
{
public function __invoke(): void
{
exit('works');
}
}
Leider wird die Funktion einfach ignoriert, obwohl ich mich (bis auf den global definierten Namespace) exakt an die Dokumentation gehalten habe. Bin ich blind und sehe den Fehler nicht oder muss die Dokumentation hier ggf. erweitert werden?
Danke für eure Zeit.
VG
Dennis
Lesezeichen