API-Controller Registrierung in service.xml

Hallo,

ich möchte im Plugin einen eigenen REST API Endpoint erstellen. Der Controller sieht momentan folgendermaßen aus:

/**
 * Class Shopware_Controllers_Api_TransArticle
 */
class Shopware_Controllers_Api_TransArticle extends Shopware_Controllers_Api_Rest
{
    /**
     * @var TransArticle
     */
    protected $resource;

    /*
    public function init()
    {
        $this->resource = \Shopware\Components\Api\Manager::getResource('TransArticle');
    }
    */

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

    /**
     * Get one TransArticle
     *
     * GET /api/TransArticle/{id}
     */
    public function getAction()
    {
        $id = $this->Request()->getParam('id');
        /** @var \IbrArticleTransfer\Models\TransArticle $trans_article */
        $trans_article = $this->resource->getOne($id);

        $this->View()->assign(['success' => true, 'data' => $trans_article]);
    }

}

Da das „Besorgen“ der Resource über _\Shopware\Components\Api\Manager::getResource _deprecated ist, möchte ich dass über die service.xml erledigen. Dabei hänge ich irgendwie an einem blöden Syntax-Problem: Die Klasse des Controllers lautet Shopware_Controllers_Api_TransArticle​ , abweichend vom php Dateinamen /Controllers/Api/TransArticle.php. Wie müsste der Eintrag in der service.xml aussehen?

funktioniert natürlich nicht. Hat jemand einen Tip für mich ?

Hast Du es mal mit 

probiert?

Viel Erfolg,

Geert

1 „Gefällt mir“

Hallo Geert,

danke für den Tip. Sieht auch logisch aus, klappt aber leider noch nicht. Der Eintrag sieht jetzt so aus:

Fehlt da ev. noch ein Tag? Mit _„shopware.event_subscriber“  _klappt es nicht.

Viele Grüße, Frank

… irgendwie kommt der Parameter für den Konstruktor nicht durch:

PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function Shopware_Controllers_Api_TransArticle::__construct(), 0 passed in ...

 

Hast Du Version 5.6 und machst Du das nach diesem Link https://developers.shopware.com/developers-guide/shopware-5-upgrade-guide-for-developers/ ?

Bis 5.5 konntest Du Controller gar nicht in der services.xml definieren.

Grüße,

Geert

… habe Version 5.6.6. Es scheitert vermutlich an der Argumentdefinition in der service.xml? Hatte zuletzt folgendes ausprobiert, was aber auch nicht klappt:

Der obere Service ist die Registrierung der Ressource, und der untere die Controller Registrierung mit dem Parameter für den Konstruktor:

/*
    public function init()
    {
        // deprecated with 5.6, will be removed with 5.8. Inject the resource instead!
        $this->resource = \Shopware\Components\Api\Manager::getResource('TransArticle');
    }
    */

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

 

Okay. Ich sehe gerade in Deinem Link den Tag, der fehlt:

Mal sehen, ob ich damit hinkomme.

Vielen Dank!

… ich habe mal den Controller, nach dem Vorbild aus dem Link, umgebaut. Leider funktioniert er danach nicht mehr. Ich bin gerade auch nicht sicher, ob das dort gezeigte Beispiel auf einen API-Controller anwendbar ist???

Vielleicht geht es gar nicht, einen eigenen API-Controller als Service zu registrieren? Damit wäre das “Injecten” der Resource nicht möglich. Frage mich, wie das dann zukünftig gehen soll, wenn _\Shopware\Components\Api\Manager::getResource() _nicht mehr funktioniert.

Hat jemand noch eine Idee, bin gerade total ratlos???

H‍allo @Frank_2812‍ ,

bist du hier noch zu einer Lösung gekommen? Stehe aktuell vor der selben Fragen. 

Ich habe bisher keine Lösung dazu gefunden. Da \Shopware\Components\Api\Manager::getResource bisher noch funktioniert, ist es kein wirkliches Problem. Falls Du aber damit weiterkommst, wäre ich natürlich auch an der Lösung interessiert!

Viele Grüße, Frank

Moin :slight_smile:

Gibt es hier inzwischen eine Lösung? Ich stehe gerade vor demselben Problem und würde ungern eine Funktion nutzen müssen, die absehbar zu Problemen führen wird.

Danke :slight_smile:

Hallo,

hat jemand dazu noch einen Tipp oder ein Beispiel wie ein Controller erfolgreich über die services.xml eingebunden wird?
Ich bekomme immer Class „Shopware_Controllers_Api_Hello“ used for service „shopware_controllers_api_hello“ cannot be found.

wenn ich es so eingebe

<service id="shopware_controllers_api_hello" class="Shopware_Controllers_Api_Hello">
    <argument type="service" id="dbal_connection"/>
    <tag name="shopware.controller" module="api" controller="Hello"/>
</service>

Der Controller liegt im Plugin unter Controllers/Api/Hello.php und heißt dort Shopware_Controllers_Api_Hello