5.2 Plugin System - Class not found // Namespace

Hallo liebe Community,

ich bin gerade dabei ein neues Plugin für Versionan ab Shopware 5.2 zu erstellen und stehe aktuell vor einen kleinen Problem.

Wahrscheinlich sieht man einfach den Wald vor lauter Bäumen nicht mehr.  Undecided

 

Zum Problem:

Wie im neuen Plugin System üblich habe ich mein neues Plugin unter /custom/plugins/VendorFooBar hinterlegt und dort eine VendorFooBar.php erstellt, welche als Bootstrap dient.
Meine dort darin enthaltene Klasse VendorFooBar erweitert von Shopware\Components\Plugin.

Soweit so gut. Installation funktioniert, Plugin aktiviert und Event greift auch.

Nun versuche ich einen Shopware 5 Core Service zu erweitern (shopware_storefront.list_product_service) allerdings bekomme ich immer die Fehlermeldung, dass die Klasse nicht gefunden wird. 

Class ‘VendorFooBar\Bundle\StoreFrontBundle\ListProductService’ not found in /www/htdocs/… on line xx

503 Service Unavailable

Laut Doku zum neuen 5.2 Plugin System sollte er die Klasse doch eigentlich an Hand des Namespaces finden. (https://developers.shopware.com/developers-guide/plugin-system/#autoloading)

 

Vielleicht sieht ja jemand schnell den Fehler! :slight_smile:

Vielen dank im voraus!!

 

/custom/plugins/VendorFooBar/VendorFooBar.php

namespace VendorFooBar;

use VendorFooBar\Subscribers\EventSubscriber;
use Shopware\Components\Plugin;
use Shopware\Components\Plugin\Context\InstallContext;
use Shopware\Components\Plugin\Context\UninstallContext;

/**
 * VendorFooBar
 *
 * @copyright xxx
 * @author xxx
 */
class VendorFooBar extends Plugin
{

    /**
     * @inheritdoc
     */
    public static function getSubscribedEvents()
    {
        return [
            'Enlight_Controller_Front_StartDispatch' => 'onRegisterSubscriber',
            'Shopware_Console_Add_Command' => 'onRegisterSubscriber'
        ];

    }

    /**
     * @param \Enlight_Event_EventArgs $args
     */
    public function onRegisterSubscriber(\Enlight_Event_EventArgs $args)
    {
        $subscribers = array(
            new EventSubscriber()
        );

        foreach ($subscribers as $subscriber) {
            $this->container->get('events')->addSubscriber($subscriber);
        }

    }

}

 

 

/custom/plugins/VendorFooBar/Subscribers/EventSubscriber.php

namespace VendorFooBar\Subscribers;

use Enlight\Event\SubscriberInterface;
use VendorFooBar\Bundle\StoreFrontBundle\ListProductService;

class EventSubscriber implements SubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return array(
            'Enlight_Bootstrap_AfterInitResource_shopware_storefront.list_product_service' => 'registerListProductService'
        );
    }

    /**
     * Register ListProductService
     */
    public function registerListProductService()
    {
        $coreService = Shopware()->Container()->get('shopware_storefront.list_product_service');
        $listProductService = new ListProductService($coreService);
        Shopware()->Container()->set('shopware_storefront.list_product_service', $listProductService);
    }

}

 

 

/custom/plugins/VendorFooBar/Bundle/StoreFrontBundle/ListProductService.php

namespace VendorFooBar\Bundle\StoreFrontBundle;

use Shopware\Bundle\StoreFrontBundle\Service\ListProductServiceInterface;
use Shopware\Bundle\StoreFrontBundle\Struct;

class ListProductService implements ListProductServiceInterface
{
    /**
     * @var ListProductServiceInterface
     */
    private $service;

    /**
     * @param ListProductServiceInterface $service
     */
    public function __construct(ListProductServiceInterface $service)
    {
        $this->service = $service;
    }

    /**
     * @inheritdoc
     */
    public function getList(array $numbers, Struct\ProductContextInterface $context)
    {
        // ...
    }

    /**
     * @inheritdoc
     */
    public function get($number, Struct\ProductContextInterface $context)
    {
        $products = $this->getList([$number], $context);
        return array_shift($products);
    }

}

 

Hallo,

ich habe mir dein plugin genau nach den oben genannten Verzeichnissen und inhalten zusammenkopiert und es funktioniert auf meiner Installation. Kontrolliere nochmal ob das Mapping zwischen Datinamen und Klassennamen in deinem echtem Plugin eingehalten wird.

Du kannst dir dein Plugin auch noch deutlich vereinfachen indem du das dekorieren des ListProductService direkt über die  services.xml Datei löst:

 

/custom/plugins/VendorFooBar/Resources/services.xml

Dadurch sparst du dir die \VendorFooBar\VendorFooBar::getSubscribedEvents() sowie die Callbacks und den EventSubscriber.

Vg,
Benjamin Cremer  Shopware

Hallo Benjamin,

vielen Dank für deine Antwort und den tollen Lösungsvorschlägen.

Ich habe nun die services.xml angelegt und den ListProductService darüber dekoriert. Dies funktioniert auch einwandfrei, da in der Cache Datei folgender Eintrag und weitere vernünftig erzeugt wird/werden.

protected function getVendorFooBar_ListProductServiceService()
{
    return $this->services['vendor_foo_bar.list_product_service'] = new \VendorFooBar\Bundle\StoreFrontBundle\ListProductService(...)
}

Allerdings bekomme ich weiterhin folgenden Fehler:

Fatal error: Class 'VendorFooBar\Bundle\StoreFrontBundle\ListProductService' not found in /www/htdocs/xxxx/xxxx/var/cache/dev_201607251359/proxies/ShopwareDevce80a801a8d164029ae09dc8b35e92182acc0ac5ProjectContainer.php on line 510
503 Service Unavailable

 

Das Mapping zwischen den Datei- und Klassennamen habe ich nun mehrfach kontrolliert und kann hier keinen Fehler feststellen. Ich habe testweise mal einen Fehler eingebaut und dort „meckert“ PHPStorm entsprechend auch sofort rum, dass die Klasse nicht gefunden werden kann.

Es kann ja wenn eigentlich nur an diesen zwei Stellen liegen:

  1. Die services.xml

 

  1. Die Klasse (/plugins/VendorFooBar/Bundle/StoreFrontBundle/ListProductService.php)

    namespace VendorFooBar\Bundle\StoreFrontBundle;

    use Shopware\Bundle\StoreFrontBundle\Service\ListProductServiceInterface;

    class ListProductService implements ListProductServiceInterface
    {
    }

 

Ich benutze übrigens Shopware 5.2.3.

 

Vielen Dank für deine Mühe und viele Grüße.

Chris.

Das ist zwar schon etwas älter, aber für eventuell weitere Mitlesende: Eine Fehlerquelle dafür kann ein Buchstabendreher im Dateinamen sein… Hat mich gerade etwas aufgehalten, bis ich das gesehen habe…