Hallo zusammen. Ich habe ein Plugin mit mehreren Controllern mit ähnlichen Funktionen, daher habe ich diese in eine Basisklasse ausgelagert. Nun wollte ich wissen wie man am Besten die Basisklasse in der Abgeleiteten Klasse einbindet z.B. über require_once(file) oder verwendet man in Shopware einen anderen Ansatz? Verzeichnis meiner Controller Klassen: Shopware\Plugins\Local\Core\ExtendedApi\Controllers\Api Basisklasse AbstractControllerBase.php: abstract class Shopware\_Controllers\_Api\_AbstractControllerBase extends Shopware\_Controllers\_Api\_Rest { ... }
Abgeleitete Klasse Currencies.php: require\_once("AbstractControllerBase.php") // ist das so der richtige Ansatz? class Shopware\_Controllers\_Api\_Currencies extends Shopware\_Controllers\_Api\_AbstractControllerBase { ... }
Danke schon vorab.
use ShopsImporter\Components\XML as XML; use Shopware\Components\Api\Resource; use ShopsImporter\Components\Error\Logger; /\*\* \* Central Import Controller. \* Distributes all the different data-types from the XMLs \* to the API-Resources. \*/ class Shopware\_Controllers\_Api\_ShopsImport extends Enlight\_Controller\_Action { }
Gruß
Danke aber anhand des Beispiels kann ich nicht erkennen wie man seine eigene Basisklasse erstellt und diese dann für weitere Controller verwendet. Wäre gut wenn hier jemand ein Beispiel geben könnte wie er das gemacht hat. Merci schon vorab
Hi, grundsätzlich kannst du deinen Basis-Controller einfach über extends ableiten. Bei korrekter Benamung und entsprechend registriertem Controller-Event, sollte der Loader das packen. Ansonsten kannst du deinen Basis-Controller auch in einen Namespace packen und diesen Namespace über den Shopware-Loader registrieren: $this-\>Application()-\>Loader()-\>registerNamespace( 'Shopware\SwagLazySubscriberExample', $this-\>Path() );
Abhängig davon, was du konkret vor hast, könnte man gemäß dem Leitsatz „composition over inheritance“ auch einfach Services aus der geteilten Logik extrahieren und sich die über den DI ziehen. Gruß, Daniel
Danke aber ich verstehe noch nicht wo bzw. wann ich „$this->Application()->Loader()->registerNamespace(…)“ aufrufen muss. Ich habe es im „Bootstrap.php“ meines lokalen Plugins versucht. Leider wird die Basisklasse nicht gefunden. Es gibt ein "Fatal error: Class ‚Shopware\Controllers\Api\Shopware_Controllers_Api_AbstractControllerBase‘ not found in „…www\shop\engine\Shopware\Plugins\Local\Core\ExtendedApi\Controllers“
Beispiel, folgende PluginStruktur:
Plugins\Local\Core\ExtendedApi\Bootstrap.php
Plugins\Local\Core\ExtendedApi\Components
Plugins\Local\Core\ExtendedApi\Components\Api
Plugins\Local\Core\ExtendedApi\Components\Api\Resource
Plugins\Local\Core\ExtendedApi\Components\Api\Resource\AbstractResourceBase.php
Plugins\Local\Core\ExtendedApi\Components\Api\Resource\ArticleDetail.php
Plugins\Local\Core\ExtendedApi\Components\Api\Resource\ ...
Plugins\Local\Core\ExtendedApi\Controllers
Plugins\Local\Core\ExtendedApi\Controllers\Api
Plugins\Local\Core\ExtendedApi\Controllers\Api\AbstractControllerBase.php
Plugins\Local\Core\ExtendedApi\Controllers\Api\ArticleDetails.php
Plugins\Local\Core\ExtendedApi\Controllers\Api\ ...
Die beiden Klassen „AbstractResourceBase“ und „AbstractControllerBase“ sind Basisklassen. Das seltsame die Basisklasse „AbstractResourceBase“ wird gefunden, jedoch nicht die Klasse „Shopware_Controllers_Api_AbstractControllerBase“
class Shopware_Controllers_Api_ArticleDetails extends Shopware_Controllers_Api_AbstractControllerBase {
...
}
abstract class Shopware_Controllers_Api_AbstractControllerBase extends Shopware_Controllers_Api_Rest {
...
}
class ArticleDetail extends AbstractResourceBase {
...
}
abstract class AbstractResourceBase extends Resource {
...
}
folgendes habe ich in Bootstrap.php schon probiert jedoch ohne Erfolg:
/**
* @param Enlight_Event_EventArgs $args
*/
public function onEnlightControllerFrontStartDispatch(Enlight_Event_EventArgs $args)
{
$this->Application()->Loader()->registerNamespace(
'Shopware\Components',
$this->Path() . 'Components/'
);
$this->Application()->Loader()->registerNamespace(
'Shopware\Controllers',
$this->Path() . 'Controllers/'
);
$this->Application()->Loader()->registerNamespace(
'Shopware\Controllers\Api',
$this->Path() . 'Controllers/Api/'
);
}
Ich bin dankbar für Beispiele, Vorschläge oder Tipps… Danke schon vorab
Hat Ihr niemand eine Idee oder Ansatz woran es liegen könnte? Danke
Kannst Du mir das aktuelle Plugin mal als *.zip schicken? Dann schaue ich mir das gerne an.