Passer au contenu principal
Il exige PHP 8.2 ou une version ultérieure et Laravel 12 ou 13.

Installation

stockshift:install publie config/stockshift.php, ajoute STOCKSHIFT_TOKEN et STOCKSHIFT_WEBHOOK_SECRET à .env et à .env.example et vous demande leurs valeurs. Créez une clé d’API dans StockShift sous Paramètres > Accès > Clés d’API. Ensuite, vérifiez-la :

Démarrage rapide

Faire des appels

La façade donne accès à chaque domaine de l’API, comme catalog() ou inventory(), et chaque domaine a une méthode par opération. Ce sont les méthodes du SDK, avec les mêmes arguments et les mêmes types PHPStan :
Vous pouvez aussi appeler un chemin directement avec get(), post(), put(), patch(), delete() ou request() :
La façade, une StockShift\Laravel\Connection injectée et un StockShift\Sdk\StockShift injecté utilisent tous la connexion par défaut.

Requêtes

Chaque liste de l’API a un constructeur de requêtes. where() envoie les filtres propres à l’API, et les résultats reviennent sous forme de collections Laravel :
lazy() renvoie une LazyCollection qui ne récupère la page suivante que lorsque vous y arrivez. Avec limit() ou take(), les pages au-delà de la limite ne sont jamais récupérées :
L’API renvoie chaque liste dans son propre ordre fixe. orderBy() et orderByDesc() trient plutôt de votre côté, donc ils lisent d’abord toute la liste. Les champs peuvent utiliser la notation pointée. Les constructeurs de la façade sont items(), stock(), movements(), counts(), transfers(), locations(), suppliers(), purchaseOrders(), customers(), salesOrders(), quotes(), invoices(), returns(), builds(), boms() et workCenters(). Toute autre liste fonctionne à partir de son chemin :
Autres méthodes : Les énumérations sont envoyées sous forme de valeur et les dates en ISO 8601.

Connexions

Une connexion, c’est un jeton, le secret webhook qui l’accompagne et ses paramètres. Ajoutez-en d’autres dans config/stockshift.php pour appeler plusieurs organisations :
Pour en injecter une, marquez le paramètre :
Chaque connexion a ces paramètres :

Un jeton par locataire

Dans une application où chaque locataire (tenant) connecte sa propre organisation StockShift, cherchez le jeton avant chaque appel :
Ou créez une connexion pour un jeton là où vous en avez besoin :
Les résultats de requêtes en cache et les limites de débit sont tenus séparément pour chaque jeton.

Erreurs

Un appel qui échoue lève l’ApiException du SDK, qui contient le corps des détails du problème RFC 9457. Basez votre logique sur errorCode, qui est stable :
Un appel qui ne reçoit aucune réponse lève une ConnectionException. Les deux étendent StockShiftException.

Nouvelles tentatives, clés d’idempotence et appels en file d’attente

Le SDK réessaie un 429 après Retry-After. Il réessaie un 5xx ou une défaillance réseau pour GET, PUT et DELETE, et pour un POST ou un PATCH seulement s’il a une clé d’idempotence :
later() envoie un appel depuis une tâche en file d’attente. Un POST ou un PATCH reçoit une clé d’idempotence à la création de la tâche, donc les propres nouvelles tentatives de la tâche envoient la même clé et l’API applique la modification une seule fois :
La tâche est StockShift\Laravel\Jobs\SendRequest. Elle fait cinq tentatives. Une réponse 4xx autre que 429 la fait échouer immédiatement, parce que la renvoyer donnerait la même réponse. Un jeton fourni par withToken() accompagne la tâche. La tâche est chiffrée dans la file d’attente.

Limites de débit

Définissez rate_limit sur une connexion pour plafonner les appels par minute que votre application fait avec un même jeton. Tous les processus qui partagent le magasin de cache partagent le compte. Un appel qui dépasserait la limite attend de pouvoir être envoyé. Laissez-le à null pour vous fier à la limite de l’API, que le client attend déjà. Les requêtes passent par le client HTTP de Laravel, donc Http::fake(), les événements RequestSending et ResponseReceived et des outils comme Telescope les voient.

Webhooks

Le paquet ajoute une route POST /stockshift/webhook. Donnez son URL complète à StockShift quand vous ajoutez un point de terminaison webhook, et mettez le secret de signature que StockShift vous montre dans STOCKSHIFT_WEBHOOK_SECRET. Chaque livraison est vérifiée par rapport à l’en-tête StockShift-Signature. Une livraison qui échoue reçoit un 400 et ne va pas plus loin. Une livraison qui passe déclenche deux événements Laravel : WebhookReceived pour chaque livraison, puis la classe propre à l’événement, comme InventoryStockMoved :
Chaque type d’événement de la référence de l’API a une classe dans StockShift\Laravel\Events, avec $data typé pour PHPStan. WebhookReceived se déclenche aussi pour les types qui n’ont pas de classe dans cette version du paquet.

Écouter avec un attribut

Marquez une classe ou une méthode avec #[OnStockShiftWebhook] :
Sur une classe, il appelle handle() ou __invoke(). Sur une méthode, il appelle cette méthode. Donnez plusieurs types, ou terminez-en un par * pour en couvrir plusieurs, comme sales.order.*. Typez le paramètre comme WebhookEvent quand il peut recevoir plus d’une classe. * seul écoute WebhookReceived. Les classes de app/Listeners sont analysées. Changez webhooks.discover dans la configuration pour analyser d’autres dossiers. Un type qui ne correspond à aucun événement échoue au démarrage avec un indice, pour qu’une faute de frappe ne passe pas inaperçue. Un écouteur que la découverte d’événements de Laravel a déjà trouvé par son indication de type n’est pas ajouté deux fois. Les écouteurs qui implémentent ShouldQueue sont mis en file d’attente comme d’habitude. php artisan optimize met en cache les écouteurs qu’il trouve. stockshift:cache et stockshift:clear font la même chose séparément.

Nouvelles tentatives et file d’attente

StockShift réessaie une livraison qui ne reçoit pas de 2xx, et chaque nouvelle tentative garde l’id de l’événement. Le paquet mémorise les identifiants pendant une journée et déclenche les événements une seule fois. Si un écouteur lève une exception, l’identifiant est oublié et la livraison reçoit un 500, pour que la nouvelle tentative soit traitée. Changez webhooks.deduplicate_for pour garder les identifiants plus longtemps, ou mettez-le à 0 pour n’en garder aucun. Définissez STOCKSHIFT_WEBHOOK_QUEUE pour répondre à StockShift immédiatement et déclencher les événements depuis une tâche en file d’attente. STOCKSHIFT_WEBHOOK_QUEUE_CONNECTION choisit la connexion de file d’attente.

Autres routes

Mettez webhooks.path à null pour omettre la route et la placer vous-même. Une route pour une autre connexion vérifie le secret de cette connexion :
Le middleware fonctionne aussi seul, sous stockshift.webhook ou stockshift.webhook:eu. Il place l’événement vérifié dans l’attribut de requête stockshift.event. Les routes webhook n’ont besoin d’aucune exception CSRF parce qu’elles ne font pas partie du groupe web. Pour ajouter un middleware, comme throttle:120,1, inscrivez-le dans webhooks.middleware.

Appeler l’API à la main

Http::stockshift() est une requête HTTP Laravel avec l’URL de base, le jeton et les délais d’expiration de la connexion. Elle ne réessaie pas et ne lève pas d’exception en cas d’erreur :

Commandes Artisan

Chacune prend --connection quand elle appelle l’API. php artisan about montre la connexion par défaut et si les écouteurs sont en cache.

Tests

StockShift::fake() répond aux appels avec les réponses que vous fournissez et enregistre chacun d’eux. Rien n’atteint l’API, et aucun jeton n’est nécessaire :
Une clé est une méthode suivie d’un chemin après l’URL de base. * correspond à n’importe quoi. Une valeur est un corps JSON, un code de statut, une réponse PSR-7 ou une fermeture qui prend la RecordedRequest et renvoie l’un de ceux-ci. StockShift::page() construit une page de liste avec les enregistrements sous le nom que la liste utilise. Un appel sans réponse lève UnexpectedRequest. Appeler fake() de nouveau ajoute des réponses au même substitut. RecordedRequest a connection, method, path, query, body, header() et idempotencyKey(). recorded() les renvoie toutes, ou celles qui correspondent à une route. assertNothingSent() vérifie qu’aucun appel n’a été fait. Pour tester vos écouteurs de webhooks, envoyez une livraison signée par la route :
dispatch() déclenche les événements sans la requête HTTP. payload() et signature() donnent le corps et l’en-tête si vous voulez l’envoyer vous-même. Comme les appels passent par le client HTTP de Laravel, Http::fake() fonctionne aussi, si vous préférez simuler au niveau HTTP.

Versions

Le paquet suit la gestion sémantique de version. Il prend en charge les versions de Laravel qui reçoivent des correctifs de sécurité et les versions de PHP que chacune d’elles prend en charge. Une nouvelle version majeure du SDK arrive avec une nouvelle version majeure du paquet.