Hallo, schreibe ein Plugin für Shopware 6.2.3.1 und PHP 7.2
Folgender Code führt immer zu einem 404 Error. Habe folgendes gemacht:
(1) das Plugin erst installiert, dann aktiviert
(2)den Cache geleert
Nix hilft. Bin mit meinem Latein am Ende. Unter meinem localhost funktioniert alles. Allerdings wurde das Plugin unter PHP 8.1 und unter Shopware 6.5 entwickelt. Die entsprechenden Unterschiede sind im Code als Kommentar deklariert. Hier zunächst der Controller Code:
?php declare(strict_types=1);
namespace WtUpdateProducts\Storefront\Controller;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Shopware\Storefront\Controller\StorefrontController;
//following classes have been depreceated and should only be used prior to Shopware 6.4.11.0
use Symfony\Component\Routing\Annotation\Route;
use Shopware\Core\Framework\Routing\Annotation\RouteScope;
/*use following class up to 6.5 major version
use Symfony\Component\Routing\Attribute\Route;
*/
use Shopware\Storefront\Page\GenericPageLoaderInterface;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Shopware\Core\Framework\Context;
use WtUpdateProducts\classes\Paths;
use WtUpdateProducts\classes\ReadOutXML;
use WtUpdateProducts\classes\Database;
use DateTime;
use Exception;
/* Use following Routing up to Shopware 6.5 major version
#[Route(defaults: ['_routeScope' => ['storefront']])]
*/
/**
* @RouteScope(scopes={"storefront"})
*/
class UpdateController extends StorefrontController
{
/* usde following code up to php 7.4
private GenericPageLoaderInterface $genericPageLoader;
private SystemConfigService $systemConfigService;
private EntityRepository $mediaRepository;
private Database $db;
*/
private $genericPageLoader;
private $systemConfigService;
private $mediaRepository;
private $db;
private const ROOTFILE1 = 'Artikel.xml';
private const ROOTFILE2 = 'SalesPrice.xml';
public function __construct(GenericPageLoaderInterface $genericPageLoader, SystemConfigService $systemConfigService, EntityRepository $mediaRepository, Database $db)
{
//create Dependency Injections,which are based on services.xml
$this->genericPageLoader = $genericPageLoader;
$this->systemConfigService = $systemConfigService;
$this->mediaRepository = $mediaRepository;
$this->db = $db;
}
/* Use following Routing up to Shopware 6.5 major version
#[Route(path: 'wt/update', name: 'frontend.update', methods: ['POST', 'GET'])]
*/
/**
* @Route("/wt/update", name="frontend.update", methods={"GET","POST"}, defaults={"XmlHttpRequest"=true, "csrf_protected"=false})
*/
public function showUpdateFormular(Request $request, SalesChannelContext $salesChannelContext, Context $context): Response
{}
hier die routes.xml
<?xml version="1.0" encoding="UTF-8" ?>
<routes xmlns="http://symfony.com/schema/routing"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/routing
https://symfony.com/schema/routing/routing-1.0.xsd">
<!--<import resource="../../Storefront/Controller/**/*Controller.php" type="annotation" />-->
<import resource="../../Storefront/Controller/UpdateController.php" type="annotation" />
</routes>
und hier noch die services.xml
<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
<service id="WtUpdateProducts\Storefront\Controller\UpdateController" public="true">
<argument type="service" id="Shopware\Storefront\Page\GenericPageLoader"/>
<argument type="service" id="Shopware\Core\System\SystemConfig\SystemConfigService"/>
<argument type="service" id="media.repository"/>
<argument type="service" id="WtUpdateProducts\classes\Database"/>
<call method="setContainer">
<argument type="service" id="service_container"/>
</call>
<call method="setTwig">
<argument type="service" id="twig"/>
</call>
</service>
<service id="WtUpdateProducts\classes\Database">
<argument type="service" id="product.repository"/>
<argument type="service" id="product_price.repository"/>
</service>
</services>
</container>
Völlig verwirrt bin ich von dem Umstand, dass ein die(); im Konstruktor keinerlei Auswirkungen hat. Wie es scheint, wird der Controller erst gar nicht aufgerufen, obgleich ich das Plugin im Backend konfigurieren kann. Im Backend funktioniert also alles! Ein Aufruf der Url {domain_url}/wt/update im Frontend führt immer ohne Angabe einer Fehlermeldung in der Log zu einem Rendering der 404 Seite