Quickstart PHP
Questo tutorial costruisce tre piccole applicazioni PHP che lavorano sulla risorsa Nazione: una le elenca, una ne crea una nuova e una aggiorna una esistente gestendo il controllo di concorrenza.
Prerequisiti
- PHP 7.4+ e Composer.
- Hai registrato un'app e ottenuto
client_ideclient_secret(per gli esperimenti conviene un'app privata). - L'SDK PHP di Amica installato via Composer come repository VCS (vedi
Installazione). Aggiungi al tuo
composer.jsonil repositoryvcshttps://github.com/amica-dev/php-sdke"amica/php-sdk": "^3.0", poi eseguicomposer update. L'SDK usa Guzzle come client HTTP.
Ottenere un access token
L'API è protetta da OAuth 2.0. Per uno script server-to-server il flusso più diretto è
Client Credentials. La risorsa Nazione fa parte delle anagrafiche, coperte dallo
scope comune.
<?php
function getAccessToken(): string
{
$client = new GuzzleHttp\Client();
$response = $client->post('https://auth.amica20.it/connect/token', [
'form_params' => [
'grant_type' => 'client_credentials',
'client_id' => 'IL_TUO_CLIENT_ID',
'client_secret' => 'IL_TUO_CLIENT_SECRET',
'scope' => 'read write comune',
],
]);
$data = json_decode((string) $response->getBody(), true);
return $data['access_token'];
}
Custodisci il client secret
Non scrivere mai client_id/client_secret nel codice versionato: leggili da
variabili d'ambiente o da un gestore di segreti.
Configurare l'SDK
<?php
$config = Amica\Sdk\Configuration::getDefaultConfiguration()
->setHost('https://customerws1.amica20.it')
->setAccessToken(getAccessToken());
Elenca
I metodi PHP ricevono i parametri in modo posizionale. Recuperiamo prima le aziende
(per il companyId), poi le prime nazioni dell'azienda 1:
<?php
$guzzle = new GuzzleHttp\Client();
try {
// Elenco delle aziende disponibili per le credenziali in uso
$aziende = new Amica\Sdk\Api\AziendaApi($guzzle, $config);
foreach ($aziende->apiVversionConfigAziendaGet('3') as $azienda) {
print_r($azienda);
}
// Prime 5 nazioni dell'azienda 1 (i parametri intermedi non usati restano null)
$nazioni = new Amica\Sdk\Api\NazioneApi($guzzle, $config);
$result = $nazioni->apiVversionCompanyIdNazioneGet('3', '1', null, 5);
foreach ($result as $nazione) {
echo $nazione->getId() . ': ' . $nazione->getNome() . ' (' . $nazione->getCodice() . ')' . PHP_EOL;
}
} catch (Exception $e) {
echo "Errore nella chiamata all'API: ", $e->getMessage(), PHP_EOL;
}
Cosa abbiamo imparato
- La configurazione si costruisce in fluent:
setHost()esetAccessToken(). - Le classi API si istanziano con un client Guzzle e la configurazione.
- I metodi seguono il pattern
apiVversionCompanyIdNazioneGet($version, $companyId, $skip, $take, ...): i parametri opzionali non usati si passano comenull.
Crea
<?php
$guzzle = new GuzzleHttp\Client();
try {
$nazioni = new Amica\Sdk\Api\NazioneApi($guzzle, $config);
$nuova = new Amica\Sdk\Model\Nazione(['nome' => 'Atlantide', 'codice' => 'AT']);
$creata = $nazioni->apiVversionCompanyIdNazionePost('3', '1', null, $nuova);
echo 'Creata la nazione ' . $creata->getNome() . ' con id ' . $creata->getId() . PHP_EOL;
} catch (Exception $e) {
echo "Errore nella chiamata all'API: ", $e->getMessage(), PHP_EOL;
}
Il modello Nazione espone nome e codice (un codice ISO 3166-1 alpha-2), oltre a
id e concurrencyToken valorizzati dall'API nella risposta.
Aggiorna
L'aggiornamento segue il flusso leggi → modifica → scrivi, riusando il
concurrencyToken ricevuto in lettura (vedi Controllo della concorrenza):
<?php
$guzzle = new GuzzleHttp\Client();
try {
$nazioni = new Amica\Sdk\Api\NazioneApi($guzzle, $config);
// 1. Leggi
$nazione = $nazioni->apiVversionCompanyIdNazioneIdGet('3', '1', 1176);
// 2. Modifica (mantenendo il concurrencyToken ricevuto)
$nazione->setNome('Atlantide (rev. 2)');
// 3. Scrivi
$aggiornata = $nazioni->apiVversionCompanyIdNazioneIdPut('3', '1', $nazione->getId(), null, $nazione);
echo 'Aggiornata: ' . $aggiornata->getNome() . ', nuovo token ' . $aggiornata->getConcurrencyToken() . PHP_EOL;
} catch (Exception $e) {
echo "Errore nella chiamata all'API: ", $e->getMessage(), PHP_EOL;
}
Conflitto di concorrenza
Un 422 Unprocessable Entity indica che qualcun altro ha modificato la nazione
dopo la tua lettura: rileggila per ottenere il concurrencyToken aggiornato,
riapplica le modifiche e riprova.
Cosa abbiamo imparato
- L'oggetto restituito porta con sé il
concurrencyToken(getConcurrencyToken()): rileggi, modifica e rispediscilo. - In aggiornamento si usa
apiVversionCompanyIdNazioneIdPut($version, $companyId, $id, null, $nazione); in creazioneapiVversionCompanyIdNazionePost($version, $companyId, null, $nazione). - Un
422segnala un conflitto di concorrenza, non un errore di validazione.
Codice sorgente dell'SDK
L'SDK PHP è open-source su github.com/amica-dev/php-sdk.