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
src/MultiPageBundle.phpCode:{ "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/ContaoManager/Plugin.phpPHP-Code:<?php
namespace BohnMedia\MultiPageBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class MultiPageBundle extends Bundle
{
}
Die Services werden aus der Datei "/src/Resources/config/services.yml" geladen.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]),
];
}
}
/src/DependencyInjection/MultiPageExtension.php
Hier definiere ich die Datei, über die der Hook geladen werden soll.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');
}
}
/src/Resources/config/services.yml
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.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 }
/src/EventListener/InitializeSystemListener.php
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?PHP-Code:<?php
namespace BohnMedia\MultiPageBundle\EventListener;
use Contao\CoreBundle\ServiceAnnotation\Hook;
/**
* @Hook("initializeSystem")
*/
class InitializeSystemListener
{
public function __invoke(): void
{
exit('works');
}
}
Danke für eure Zeit.
VG
Dennis

Zitieren
