connectors
object
%Connector
/phlo/resources/connectors/Connector.phlo
const
Connector :: section
line 11
Definieert een sectie binnen een Connector, waarmee gerelateerde componenten en functionaliteiten kunnen worden georganiseerd.
voidconst
Connector :: api
line 12
Definieert een connector voor API-interacties, waardoor naadloze communicatie tussen verschillende diensten mogelijk is.
voidmethod
%Connector -> __construct (?array $config = null)
line 14
Initialiseert een Connector-instantie met optionele configuratie-instellingen. Als er geen configuratie wordt opgegeven, probeert het inloggegevens te laden vanuit een vooraf gedefinieerde sectie.
if ($config === null){
$section = static::section
$creds = $section ? %creds->{$section} : null
$config = $creds ? (array)$creds->toArray : []
}
$this->config = $config
$this->timeout = 15
$this->retries = 0static
Connector :: make (?array $config = null):static
line 25
Maakt een nieuwe instantie van de Connector-klasse met de opgegeven configuratie.
new static($config)method
%Connector -> base:string
line 27
Toegang tot de basis-API voor de Connector, waarmee interactie met de kernfunctionaliteiten mogelijk is.
static::apimethod
%Connector -> headers:array
line 28
Deze eigenschap haalt de headers op die aan de Connector zijn gekoppeld.
[]static
Connector :: fields:array
line 30
Connector::$fields is een statische eigenschap die een array met velddefinities voor de Connector-klasse bevat.
[]method
%Connector -> configured (...$keys):bool
line 32
Controleert of alle opgegeven sleutels zijn geconfigureerd in de configuratie van de Connector. Geeft true terug als alle sleutels aanwezig zijn, anders false.
foreach ($keys AS $key){
if (($this->config[$key] ?? void) === void) return false
}
return truemethod
%Connector -> missing (...$keys):?obj
line 39
Controleert of de opgegeven inloggegevens zijn geconfigureerd en retourneert null als dat het geval is; anders wordt er een foutmelding geactiveerd die aangeeft welke inloggegevens ontbreken.
return $this->configured(...$keys) ? null : static::fail(static::section.' credentials not configured ('.implode(', ', $keys).')')static
Connector :: bearer ($token):string
line 43
De Connector::$bearer-eigenschap bevat de geformatteerde autorisatieheaderwaarde met een Bearer-token voor API-aanvragen.
'Authorization: Bearer '.$tokenstatic
Connector :: basic ($user, $pass):string
line 44
Genereert een Basic Authorization-header door de opgegeven gebruikersnaam en wachtwoord in base64-indeling te coderen.
'Authorization: Basic '.base64_encode($user.colon.$pass)static
Connector :: build (string $method, string $url, ?array $query = null, array $headers = [], mixed $json = null, mixed $form = null):array
line 46
if ($query) $url .= (str_contains($url, qm) ? '&' : qm).http_build_query($query)
$body = null
if ($json !== null){
$body = is_string($json) ? $json : json_encode($json, jsonFlat)
$headers[] = 'Content-Type: application/json'
}
elseif ($form !== null){
$body = is_string($form) ? $form : http_build_query($form)
$headers[] = 'Content-Type: application/x-www-form-urlencoded'
}
$headers[] = 'Accept: application/json'
return ['method' => strtoupper($method), 'url' => $url, 'headers' => $headers, 'body' => $body]static
Connector :: ok ($data, int $status = 200):obj
line 61
De Connector::$ok-eigenschap bevat een object met een boolean 'ok'-waarde, een 'status' en 'data'-attributen.
obj(ok: true, status: $status, data: $data)static
Connector :: fail ($error, int $status = 0):obj
line 62
De Connector::$fail-eigenschap vertegenwoordigt een foutstatus, met een object waarin 'ok' op false is ingesteld, samen met de 'status' en 'error'-details.
obj(ok: false, status: $status, error: $error)static
Connector :: errorMessage ($data, string $raw, int $status):string
line 64
Connector::$errorMessage haalt het foutbericht op uit een gegeven data-object, controleert verschillende eigenschappen op een stringrepresentatie van de fout en valt terug op een geformatteerd HTTP-statusbericht als er geen fout wordt gevonden.
if (is_object($data)){
if (isset($data->error->message)) return (string)$data->error->message
if (isset($data->error) && is_string($data->error)) return $data->error
if (isset($data->message)) return (string)$data->message
if (isset($data->errors)){
$errors = $data->errors
if (is_string($errors)) return $errors
if (is_array($errors)) return is_string($errors[0] ?? null) ? $errors[0] : json_encode($errors)
if (is_object($errors)) return json_encode($errors)
}
}
return $raw !== void ? $raw : 'HTTP '.$statusstatic
Connector :: parse ($raw, int $status = 200):obj
line 79
Parses een ruwe invoerstring naar een JSON-object en retourneert een succesvolle reactie of een foutmelding op basis van de HTTP-statuscode.
$raw = (string)$raw
$data = $raw === void ? null : json_decode($raw)
if ($status < 200 || $status >= 300) return static::fail(static::errorMessage($data, $raw, $status), $status)
return obj(ok: true, status: $status, data: $data ?? $raw)static
Connector :: retryable ($method, int $status):bool
line 86
in_array($method, ['GET', 'HEAD', 'QUERY']) && ($status === 429 || $status >= 500)static
Connector :: backoff (int $attempt, $response):int
line 88
De Connector::$backoff-eigenschap berekent de backoff-tijd in microseconden op basis van de 'retry-after'-header van de respons, met een maximumlimiet van 30 seconden of een standaardwaarde vermenigvuldigd met het aantal pogingen.
$after = (int)($response->headers['retry-after'] ?? 0)
return $after > 0 ? min($after, 30) * 1000000 : 200000 * $attemptmethod
%Connector -> dispatch (array $req):obj
line 97
Retries only what retryable() allows, and waits as long as the server asked for.
$method = $req['method']
$body = $req['body']
$attempt = 0
$response = null
while (true){
try {
if ($method === 'GET') $raw = HTTP($req['url'], $req['headers'], cookies: false, timeout: $this->timeout, response: $response)
elseif ($method === 'DELETE') $raw = HTTP($req['url'], $req['headers'], DELETE: true, cookies: false, timeout: $this->timeout, response: $response)
elseif ($method === 'PUT') $raw = HTTP($req['url'], $req['headers'], PUT: $body ?? void, cookies: false, timeout: $this->timeout, response: $response)
elseif ($method === 'PATCH') $raw = HTTP($req['url'], $req['headers'], PATCH: $body ?? void, cookies: false, timeout: $this->timeout, response: $response)
elseif ($method === 'QUERY') $raw = HTTP($req['url'], $req['headers'], QUERY: $body ?? void, cookies: false, timeout: $this->timeout, response: $response)
else $raw = HTTP($req['url'], $req['headers'], POST: $body ?? void, cookies: false, timeout: $this->timeout, response: $response)
}
catch (\Throwable $e){
return static::fail($e->getMessage(), 0)
}
$status = $response->status ?? 0
if (($status >= 200 && $status < 300) || !static::retryable($method, $status) || $attempt >= $this->retries) break
usleep(static::backoff(++$attempt, $response))
}
$result = static::parse($raw, $status)
$result->headers = $response->headers ?? []
return $resultmethod
%Connector -> request (string $method, string $url, ?array $query = null, array $headers = [], mixed $json = null, mixed $form = null):obj
line 123
Verzendt een HTTP-verzoek met de opgegeven methode, URL, queryparameters, headers en optionele JSON- of formuliergegevens.
if (!str_starts_with($url, 'http')) $url = rtrim((string)$this->base, slash).slash.ltrim($url, slash)
$headers = array_merge((array)$this->headers, $headers)
return $this->dispatch(static::build($method, $url, $query, $headers, $json, $form))method
%Connector -> get (string $url, ?array $query = null, array $headers = []):obj
line 129
Verstuurt een GET-verzoek naar de opgegeven URL met optionele queryparameters en headers.
$this->request('GET', $url, query: $query, headers: $headers)method
%Connector -> post (string $url, mixed $json = null, array $headers = []):obj
line 130
Verzendt een POST-verzoek naar de opgegeven URL met optionele JSON-gegevens en headers.
$this->request('POST', $url, headers: $headers, json: $json)method
%Connector -> put (string $url, mixed $json = null, array $headers = []):obj
line 131
Verzendt een PUT-verzoek naar de opgegeven URL met optionele JSON-gegevens en headers.
$this->request('PUT', $url, headers: $headers, json: $json)method
%Connector -> patch (string $url, mixed $json = null, array $headers = []):obj
line 132
Verstuurt een PATCH-verzoek naar de opgegeven URL met optionele JSON-gegevens en headers.
$this->request('PATCH', $url, headers: $headers, json: $json)method
%Connector -> query (string $url, mixed $json = null, array $headers = []):obj
line 133
$this->request('QUERY', $url, headers: $headers, json: $json)method
%Connector -> del (string $url, array $headers = []):obj
line 134
Stuurt een DELETE-verzoek naar de opgegeven URL met optionele headers.
$this->request('DELETE', $url, headers: $headers)method
%Connector -> form (string $url, array $fields, array $headers = []):obj
line 135
Verzendt een POST-verzoek naar de opgegeven URL met de gegeven formulier velden en headers.
$this->request('POST', $url, headers: $headers, form: $fields)method
%Connector -> paginate (string $url, callable $extract, ?array $query = null, string $param = 'page', int $start = 1, int $max = 0):array
line 137
Haal gepagineerde gegevens op van een opgegeven URL, waarbij items worden geëxtraheerd met behulp van een opgegeven callable en deze worden verzameld totdat een maximum aantal is bereikt of er geen gegevens meer beschikbaar zijn.
$items = []
$page = $start
while (true){
$res = $this->get($url, ($query ?? []) + [$param => $page])
if (!$res->ok) break
$batch = $extract($res->data)
if (!$batch) break
foreach ($batch AS $item) $items[] = $item
if ($max && count($items) >= $max) break
$page++
}
return $itemsobject
%EBoekhouden
/phlo/resources/connectors/finance/EBoekhouden.phlo
const
EBoekhouden :: section
line 12
'EBoekhouden'const
EBoekhouden :: api
line 13
'https://api.e-boekhouden.nl/v1'prop
%EBoekhouden -> sessionToken:string
line 15
voidmethod
%EBoekhouden -> headers:array
line 17
$this->sessionToken !== void ? ['Authorization: '.$this->sessionToken] : []static
EBoekhouden :: fields:array
line 19
arr(
section: 'EBoekhouden',
config: arr(source: 'Source label shown in the e-Boekhouden audit trail (optional)'),
secret: arr(api_token: 'API token (Beheer > Instellingen > API)'),
)method
%EBoekhouden -> session:obj
line 28
Returns the session token, fetching one on first use.
if ($m = $this->missing('api_token')) return $m
if ($this->sessionToken !== void) return static::ok($this->sessionToken)
$res = $this->post('session', ['accessToken' => trim((string)$this->config['api_token']), 'source' => (string)($this->config['source'] ?? 'Phlo')])
if (!$res->ok) return $res
$token = (string)($res->data->token ?? void)
if ($token === void) return static::fail('e-Boekhouden session token missing in response', $res->status)
$this->sessionToken = $token
return static::ok($token)method
%EBoekhouden -> guard:?obj
line 39
$res = $this->session
return $res->ok ? null : $resmethod
%EBoekhouden -> relations (array $query = []):obj
line 44
if ($m = $this->guard) return $m
return $this->get('relation', $query)method
%EBoekhouden -> createRelation (array $relation):obj
line 49
if ($m = $this->guard) return $m
return $this->post('relation', $relation)method
%EBoekhouden -> invoices (array $query = []):obj
line 54
if ($m = $this->guard) return $m
return $this->get('invoice', $query)method
%EBoekhouden -> createInvoice (array $invoice):obj
line 59
if ($m = $this->guard) return $m
return $this->post('invoice', $invoice)object
%ExactOnline
/phlo/resources/connectors/finance/ExactOnline.phlo
const
ExactOnline :: section
line 12
Definieert een sectie binnen de ExactOnline resource, waardoor gestructureerd databeheer mogelijk is.
'ExactOnline'const
ExactOnline :: tokenUrl
line 13
Geeft de URL terug voor het verkrijgen van een OAuth2-token van ExactOnline.
'https://start.exactonline.nl/api/oauth2/token'method
%ExactOnline -> base:string
line 15
Stelt de basis-URL voor de ExactOnline API samen met de opgegeven divisie uit de configuratie.
'https://start.exactonline.nl/api/v1/'.($this->config['division'] ?? void)static
ExactOnline :: fields:array
line 17
Definieert de velden die nodig zijn voor integratie met ExactOnline, inclusief configuratie voor OAuth-gegevens en scopes.
arr(
section: 'ExactOnline',
config: arr(division: 'Division (administration) number'),
secret: arr(
client_id: 'OAuth client ID',
client_secret: 'OAuth client secret',
refresh_token: 'OAuth refresh token (managed and rotated after first authorization)',
),
scopes: 'OAuth2 authorization code flow; token endpoint refreshes automatically',
)method
%ExactOnline -> guard:?obj
line 28
Controleert op de aanwezigheid van vereiste parameters 'division', 'client_id', 'client_secret' en 'refresh_token'.
$this->missing('division', 'client_id', 'client_secret', 'refresh_token')method
%ExactOnline -> invoices (array $query = []):obj
line 30
Haal een lijst van verkoopfacturen op uit ExactOnline op basis van de opgegeven queryparameters.
if ($m = $this->guard) return $m
return $this->get('salesinvoice/SalesInvoices', $query)method
%ExactOnline -> accounts (array $query = []):obj
line 35
Haal accountinformatie op van ExactOnline met de opgegeven queryparameters.
if ($m = $this->guard) return $m
return $this->get('crm/Accounts', $query)method
%ExactOnline -> createInvoice (array $invoice):obj
line 40
Maakt een nieuwe factuur aan in ExactOnline met de opgegeven factuurgegevens.
if ($m = $this->guard) return $m
return $this->post('salesinvoice/SalesInvoices', $invoice)object
%GoogleCalendar
/phlo/resources/connectors/cloud/GoogleCalendar.phlo
const
GoogleCalendar :: section
line 12
Definieert een sectie binnen een Google Calendar-resource, waarmee evenementen en details kunnen worden georganiseerd.
'Google'const
GoogleCalendar :: tokenUrl
line 13
Dit is de URL-eindpunt die wordt gebruikt om een toegangstoken te verkrijgen van de OAuth 2.0-autorisatieserver van Google Calendar.
'https://oauth2.googleapis.com/token'method
%GoogleCalendar -> base:string
line 15
Dit definieert de basis-URL voor toegang tot de Google Calendar API versie 3.
'https://www.googleapis.com/calendar/v3'static
GoogleCalendar :: fields:array
line 17
GoogleCalendar::$fields biedt configuratiegegevens voor toegang tot Google Calendar, inclusief OAuth-gegevens en vereiste scopes.
arr(
section: 'Google',
secret: arr(
client_id: 'OAuth client ID',
client_secret: 'OAuth client secret',
refresh_token: 'OAuth refresh token (scopes: calendar, spreadsheets)',
),
scopes: 'https://www.googleapis.com/auth/calendar, https://www.googleapis.com/auth/spreadsheets',
)method
%GoogleCalendar -> guard:?obj
line 27
Controleert op de aanwezigheid van vereiste inloggegevens: client_id, client_secret en refresh_token.
$this->missing('client_id', 'client_secret', 'refresh_token')method
%GoogleCalendar -> events (string $calendarId = 'primary', array $query = []):obj
line 29
Haal evenementen op uit een opgegeven Google Agenda met behulp van de opgegeven agenda-ID en optionele queryparameters.
if ($m = $this->guard) return $m
return $this->get('calendars/'.rawurlencode($calendarId).'/events', $query)method
%GoogleCalendar -> createEvent (array $event, string $calendarId = 'primary'):obj
line 34
Maakt een nieuwe gebeurtenis in de opgegeven Google Calendar met de verstrekte gebeurtenisdetails.
if ($m = $this->guard) return $m
return $this->post('calendars/'.rawurlencode($calendarId).'/events', $event)object
%GoogleSheets
/phlo/resources/connectors/cloud/GoogleSheets.phlo
const
GoogleSheets :: section
line 12
Definieert een sectie voor het organiseren van gegevens binnen een Google Sheets-resource.
'Google'const
GoogleSheets :: tokenUrl
line 13
Dit is de URL-eindpunt voor het verkrijgen van OAuth 2.0-tokens van Google Sheets.
'https://oauth2.googleapis.com/token'method
%GoogleSheets -> base:string
line 15
Dit item vertegenwoordigt een basis-URL voor het toegang krijgen tot de Google Sheets API, specifiek de eindpunt voor interactie met spreadsheets.
'https://sheets.googleapis.com/v4/spreadsheets'static
GoogleSheets :: fields:array
line 17
Definieert de configuratievelden voor Google Sheets-integratie, inclusief OAuth-gegevens en vereiste scopes.
arr(
section: 'Google',
secret: arr(
client_id: 'OAuth client ID',
client_secret: 'OAuth client secret',
refresh_token: 'OAuth refresh token (scopes: calendar, spreadsheets)',
),
scopes: 'https://www.googleapis.com/auth/spreadsheets',
)method
%GoogleSheets -> guard:?obj
line 27
Controleert of de vereiste inloggegevens aanwezig zijn: client_id, client_secret en refresh_token.
$this->missing('client_id', 'client_secret', 'refresh_token')method
%GoogleSheets -> values ($spreadsheetId, string $range):obj
line 29
Haalt de waarden op uit een opgegeven bereik in een Google Sheets-spreadsheet die wordt geïdentificeerd door de gegeven spreadsheet-ID.
if ($m = $this->guard) return $m
return $this->get($spreadsheetId.'/values/'.rawurlencode($range))method
%GoogleSheets -> append ($spreadsheetId, string $range, array $rows, string $valueInputOption = 'USER_ENTERED'):obj
line 34
Voegt rijen met gegevens toe aan een opgegeven bereik in een Google Sheets-spreadsheet, met gebruik van de opgegeven invoeroptie voor waarden.
if ($m = $this->guard) return $m
return $this->post($spreadsheetId.'/values/'.rawurlencode($range).':append?valueInputOption='.$valueInputOption, ['values' => $rows])object
%Lightspeed
/phlo/resources/connectors/shops/Lightspeed.phlo
const
Lightspeed :: section
line 12
Definieert een sectie in een Lightspeed-applicatie, waarmee de organisatie en het beheer van inhoud binnen die sectie mogelijk wordt gemaakt.
'Lightspeed'method
%Lightspeed -> base:string
line 14
Lightspeed->base bouwt de basis-URL voor toegang tot de Lightspeed API, waarbij de cluster-ID uit de configuratie wordt opgenomen als deze beschikbaar is.
'https://api.lightspeedapp.com/API/V3/Account/'.($this->config['cluster_id'] ?? void)method
%Lightspeed -> headers:array
line 16
Deze methode haalt de headers op die nodig zijn voor authenticatie bij de Lightspeed API met de opgegeven API-sleutel en geheim uit de configuratie.
[static::basic($this->config['api_key'] ?? void, $this->config['api_secret'] ?? void)]static
Lightspeed :: fields:array
line 18
Lightspeed::$fields definieert de configuratievelden die nodig zijn voor verbinding met de Lightspeed API, inclusief cluster-ID, taal, API-sleutel, API-geheim en toegangsrechten.
arr(
section: 'Lightspeed',
config: arr(
cluster_id: 'Account / cluster ID',
language: 'Language (optional, default nl)',
),
secret: arr(
api_key: 'API key',
api_secret: 'API secret',
),
scopes: 'Customer read/write, Sale read',
)method
%Lightspeed -> customers (array $query = []):obj
line 31
Haalt klantgegevens op van de Lightspeed API met de opgegeven queryparameters.
if ($m = $this->missing('cluster_id', 'api_key', 'api_secret')) return $m
return $this->get('Customer.json', $query)method
%Lightspeed -> findCustomer ($participant):obj
line 36
Zoekt een klant op basis van hun e-mailadres of telefoonnummer, afhankelijk van het formaat van de opgegeven deelnemer identificatie.
if ($m = $this->missing('cluster_id', 'api_key', 'api_secret')) return $m
$field = str_contains((string)$participant, '@') ? 'Email' : 'Phone'
return $this->get('Customer.json', [$field => $participant, 'limit' => 1])method
%Lightspeed -> customer ($id):obj
line 42
Haal klantinformatie op van de Lightspeed API met de opgegeven klant-ID.
if ($m = $this->missing('cluster_id', 'api_key', 'api_secret')) return $m
return $this->get('Customer/'.$id.'.json')method
%Lightspeed -> sales (array $query = []):obj
line 47
Haal verkoopgegevens op van de API met de opgegeven queryparameters, waarbij wordt gecontroleerd of de vereiste inloggegevens aanwezig zijn.
if ($m = $this->missing('cluster_id', 'api_key', 'api_secret')) return $m
return $this->get('Sale.json', $query)method
%Lightspeed -> createCustomer (array $customer):obj
line 52
Maakt een nieuwe klant aan door de opgegeven klantgegevens naar de Lightspeed API te sturen, waarbij wordt gecontroleerd of vereiste parameters aanwezig zijn.
if ($m = $this->missing('cluster_id', 'api_key', 'api_secret')) return $m
return $this->post('Customer.json', $customer)object
%MessageBird
/phlo/resources/connectors/chat/MessageBird.phlo
const
MessageBird :: section
line 12
Definieert een sectie voor MessageBird binnen de Phlo-applicatie.
'MessageBird'method
%MessageBird -> base:string
line 14
Dit definieert de basis-URL voor de MessageBird API, die wordt gebruikt voor het verzenden en ontvangen van berichten.
'https://rest.messagebird.com'method
%MessageBird -> headers:array
line 16
Dit haalt de headers op die nodig zijn voor het authenticeren van verzoeken aan de MessageBird API met de opgegeven toegangssleutel.
['Authorization: AccessKey '.($this->config['access_key'] ?? void)]static
MessageBird :: fields:array
line 18
Definieert de velden voor de MessageBird-configuratie, inclusief de afzender en toegangssleutel.
arr(
section: 'MessageBird',
config: arr(originator: 'Originator (sender number or name)'),
secret: arr(access_key: 'Access key'),
)static
MessageBird :: errorMessage ($data, string $raw, int $status):string
line 24
Haal het foutbericht op uit de MessageBird API-respons, indien beschikbaar; anders valt het terug op de foutberichtmethode van de bovenliggende klasse.
if (is_object($data) && isset($data->errors[0]->description)) return (string)$data->errors[0]->description
return parent::errorMessage($data, $raw, $status)method
%MessageBird -> sms ($to, $body, array $extra = []):obj
line 29
Verzendt een SMS-bericht naar de opgegeven ontvanger(s) met behulp van de MessageBird API, waarbij een toegangssleutel en originator-configuratie vereist zijn.
if ($m = $this->missing('access_key', 'originator')) return $m
$recipients = is_array($to) ? $to : [$to]
return $this->post('messages', ['originator' => $this->config['originator'], 'recipients' => $recipients, 'body' => $body] + $extra)object
%MicrosoftGraph
/phlo/resources/connectors/cloud/MicrosoftGraph.phlo
const
MicrosoftGraph :: section
line 12
Deze functie werkt samen met de Microsoft Graph API om secties binnen een resource te beheren.
'Microsoft'method
%MicrosoftGraph -> base:string
line 14
Dit definieert de basis-URL voor toegang tot de Microsoft Graph API, waarmee interactie met Microsoft-diensten en -bronnen mogelijk is.
'https://graph.microsoft.com/v1.0'method
%MicrosoftGraph -> headers:array
line 16
Dit item haalt de headers op die nodig zijn voor authenticatie met Microsoft Graph met behulp van een bearer-token.
[static::bearer((string)$this->token)]static
MicrosoftGraph :: fields:array
line 18
Definieert de configuratievelden die nodig zijn om verbinding te maken met Microsoft Graph, inclusief tenant-ID, client-ID, mailbox, clientgeheim en applicatiepermissies.
arr(
section: 'Microsoft',
config: arr(
tenant_id: 'Azure AD tenant ID',
client_id: 'App registration client ID',
mailbox: 'Default mailbox / user UPN for calendar and mail (optional)',
),
secret: arr(client_secret: 'App registration client secret'),
scopes: 'Application permissions: User.Read.All, Calendars.ReadWrite, Mail.Send',
)prop
%MicrosoftGraph -> token:string
line 29
Haal een toegangstoken op van Microsoft Graph met behulp van de fetchToken-methode.
$this->fetchToken()method
%MicrosoftGraph -> fetchToken:string
line 35
Caches the app-only token in APCu until a minute before it expires.
$tenant = $this->config['tenant_id'] ?? void
$id = $this->config['client_id'] ?? void
$secret = $this->config['client_secret'] ?? void
if ($tenant === void || $id === void || $secret === void) return void
$key = 'phlo:graph:'.$tenant.colon.$id
if (function_exists('apcu_fetch')){
$cached = apcu_fetch($key)
if ($cached) return $cached
}
$res = $this->dispatch(static::build('POST', 'https://login.microsoftonline.com/'.$tenant.'/oauth2/v2.0/token', null, [], null, ['grant_type' => 'client_credentials', 'client_id' => $id, 'client_secret' => $secret, 'scope' => 'https://graph.microsoft.com/.default']))
if (!$res->ok) return void
$token = $res->data->access_token ?? void
$expires = (int)($res->data->expires_in ?? 3600)
if ($token !== void && function_exists('apcu_store')) apcu_store($key, $token, max(60, $expires - 60))
return $tokenmethod
%MicrosoftGraph -> mailbox ($user = null):string
line 53
Haal de mailbox op die is gekoppeld aan een opgegeven gebruiker, of gebruik een geconfigureerde mailbox als er geen gebruiker is opgegeven.
$user ?? ($this->config['mailbox'] ?? void)method
%MicrosoftGraph -> users (array $query = []):obj
line 55
Haal een lijst van gebruikers op uit Microsoft Graph op basis van de opgegeven queryparameters.
if ($m = $this->missing('tenant_id', 'client_id', 'client_secret')) return $m
return $this->get('users', $query)method
%MicrosoftGraph -> user ($id):obj
line 60
Haal gebruikersinformatie op van Microsoft Graph met de opgegeven gebruikers-ID.
if ($m = $this->missing('tenant_id', 'client_id', 'client_secret')) return $m
return $this->get('users/'.rawurlencode((string)$id))method
%MicrosoftGraph -> events ($user = null, array $query = []):obj
line 65
Haal evenementen op uit de Microsoft mailbox van een opgegeven gebruiker met behulp van de Microsoft Graph API.
if ($m = $this->missing('tenant_id', 'client_id', 'client_secret')) return $m
$mailbox = $this->mailbox($user)
if ($mailbox === void) return static::fail('Microsoft mailbox required')
return $this->get('users/'.rawurlencode((string)$mailbox).'/events', $query)method
%MicrosoftGraph -> sendMail ($message, $user = null, bool $save = true):obj
line 72
Verzendt een e-mailbericht met behulp van de Microsoft Graph API, met de optie om een gebruiker op te geven en of het bericht in de map Verzonden Items moet worden opgeslagen.
if ($m = $this->missing('tenant_id', 'client_id', 'client_secret')) return $m
$mailbox = $this->mailbox($user)
if ($mailbox === void) return static::fail('Microsoft mailbox required')
return $this->post('users/'.rawurlencode((string)$mailbox).'/sendMail', ['message' => $message, 'saveToSentItems' => $save])method
%MicrosoftGraph -> createEvent (array $event, $user = null):obj
line 79
Maakt een nieuwe gebeurtenis aan in de Microsoft-agenda van de opgegeven gebruiker met de verstrekte gebeurtenisdetails.
if ($m = $this->missing('tenant_id', 'client_id', 'client_secret')) return $m
$mailbox = $this->mailbox($user)
if ($mailbox === void) return static::fail('Microsoft mailbox required')
return $this->post('users/'.rawurlencode((string)$mailbox).'/events', $event)object
%Moneybird
/phlo/resources/connectors/finance/Moneybird.phlo
const
Moneybird :: section
line 12
Definieert een sectie binnen de Moneybird-integratie voor het organiseren van gerelateerde functionaliteiten.
'Moneybird'method
%Moneybird -> base:string
line 14
Dit haalt de basis-URL voor de Moneybird API op, waarbij de administratie-ID uit de configuratie wordt opgenomen als deze beschikbaar is.
'https://moneybird.com/api/v2/'.($this->config['administration_id'] ?? void)method
%Moneybird -> headers:array
line 16
Geeft de headers terug die nodig zijn voor authenticatie met de Moneybird API, met behulp van een bearer token dat is afgeleid van de toegangstoken in de configuratie.
[static::bearer($this->config['access_token'] ?? void)]static
Moneybird :: fields:array
line 18
Definieert de velden voor de Moneybird-integratie, inclusief de administratie-ID en een persoonlijk toegangstoken voor toegang tot contacten en facturen.
arr(
section: 'Moneybird',
config: arr(administration_id: 'Administration ID'),
secret: arr(access_token: 'Personal access token with read/write for contacts and invoices'),
)method
%Moneybird -> contacts (array $query = []):obj
line 24
Haalt een lijst van contacten op uit Moneybird op basis van de opgegeven queryparameters.
if ($m = $this->missing('administration_id', 'access_token')) return $m
return $this->get('contacts.json', $query)method
%Moneybird -> findContact ($query):obj
line 29
Zoekt een contact in Moneybird op basis van de opgegeven zoekopdracht en retourneert het eerste gevonden resultaat.
if ($m = $this->missing('administration_id', 'access_token')) return $m
return $this->get('contacts.json', ['query' => $query, 'per_page' => 1])method
%Moneybird -> contact ($id):obj
line 34
Haal de contactinformatie op die is gekoppeld aan de opgegeven ID van Moneybird, waarbij een administratie-ID en toegangstoken vereist zijn.
if ($m = $this->missing('administration_id', 'access_token')) return $m
return $this->get('contacts/'.$id.'.json')method
%Moneybird -> invoices (array $query = []):obj
line 39
Haalt facturen op uit Moneybird op basis van de opgegeven queryparameters, waarbij een 'administration_id' en 'access_token' vereist zijn.
if ($m = $this->missing('administration_id', 'access_token')) return $m
return $this->get('sales_invoices.json', $query)method
%Moneybird -> createContact (array $contact):obj
line 44
Maakt een nieuw contact aan in Moneybird met de opgegeven contactgegevens. Het vereist een administratie-ID en toegangstoken om correct te functioneren.
if ($m = $this->missing('administration_id', 'access_token')) return $m
return $this->post('contacts.json', ['contact' => $contact])method
%Moneybird -> createInvoice (array $invoice):obj
line 49
Maakt een nieuwe factuur aan in Moneybird met de opgegeven factuurgegevens.
if ($m = $this->missing('administration_id', 'access_token')) return $m
return $this->post('sales_invoices.json', ['sales_invoice' => $invoice])object
%OAuthConnector
/phlo/resources/connectors/OAuthConnector.phlo
const
OAuthConnector :: tokenUrl
line 12
Geeft de URL op voor het verkrijgen van een OAuth-token.
voidmethod
%OAuthConnector -> oauthKey:string
line 14
Haalt de OAuth-sleutel op voor de huidige sectie in de OAuthConnector.
static::sectionprop
%OAuthConnector -> token:?string
line 16
Haal de OAuth-token op met de opgegeven referenties en ververs-token uit de TokenStore.
TokenStore::access($this->oauthKey, static::tokenUrl, $this->config['client_id'] ?? void, $this->config['client_secret'] ?? void, ['refresh_token' => $this->config['refresh_token'] ?? null])method
%OAuthConnector -> headers:array
line 18
Geeft de headers terug die nodig zijn voor OAuth-authenticatie, inclusief een bearer-token afgeleid van de token van de instantie.
[static::bearer((string)$this->token)]method
%OAuthConnector -> authed:bool
line 20
Controleert of het OAuth-token is geauthenticeerd door te verifiëren dat het niet leeg is.
(string)$this->token !== voidobject
%Resend
/phlo/resources/connectors/chat/Resend.phlo
const
Resend :: section
line 12
Resend::section stelt je in staat om een sectie in een Resend-resource te definiëren voor het organiseren van gerelateerde inhoud.
'Resend'method
%Resend -> base:string
line 14
Stelt de basis-URL in voor de Resend API.
'https://api.resend.com'method
%Resend -> headers:array
line 16
Stelt de headers in voor het Resend-verzoek met de opgegeven API-sleutel uit de configuratie.
[static::bearer($this->config['api_key'] ?? void)]static
Resend :: fields:array
line 18
Definieert de velden voor de Resend-configuratie, inclusief het standaard afzender-e-mailadres en de API-sleutel.
arr(
section: 'Resend',
config: arr(from_email: 'Default sender, e.g. "App <noreply@yourdomain.com>"'),
secret: arr(api_key: 'API key (re_...)'),
)method
%Resend -> send ($to, $subject, $html = void, array $extra = []):obj
line 24
Verzendt een e-mail naar de opgegeven ontvanger(s) met het opgegeven onderwerp en optionele HTML-inhoud, met gebruik van het geconfigureerde afzender-e-mailadres.
if ($m = $this->missing('api_key', 'from_email')) return $m
$email = ['from' => $this->config['from_email'], 'to' => is_array($to) ? $to : [$to], 'subject' => $subject]
if ($html !== void) $email['html'] = $html
return $this->post('emails', $email + $extra)object
%Shopify
/phlo/resources/connectors/shops/Shopify.phlo
const
Shopify :: section
line 12
Definieert een sectie in een Shopify-thema, waarmee aanpasbare inhoud en lay-out binnen de winkel mogelijk zijn.
'Shopify'method
%Shopify -> base:string
line 14
Bouwt de basis-URL voor de Shopify API met behulp van het winkeldomein en de API-versie uit de configuratie.
'https://'.($this->config['shop_domain'] ?? void).'/admin/api/'.($this->config['api_version'] ?? '2024-01')method
%Shopify -> headers:array
line 16
Dit haalt de headers op die nodig zijn voor Shopify API-authenticatie, inclusief het toegangstoken uit de configuratie.
['X-Shopify-Access-Token: '.($this->config['access_token'] ?? void)]static
Shopify :: fields:array
line 18
Definieert de configuratievelden voor integratie met Shopify, inclusief winkel-domein, API-versie, toegangstoken en vereiste scopes.
arr(
section: 'Shopify',
config: arr(
shop_domain: 'Shop domain, e.g. your-store.myshopify.com',
api_version: 'Admin API version (optional, default 2024-01)',
),
secret: arr(access_token: 'Admin API access token (shpat_...)'),
scopes: 'read_customers, read_orders, read_products, write_draft_orders, write_inventory',
)method
%Shopify -> customers (array $query = []):obj
line 28
Haalt een lijst van klanten op uit Shopify met de opgegeven queryparameters.
if ($m = $this->missing('shop_domain', 'access_token')) return $m
return $this->get('customers.json', $query)method
%Shopify -> searchCustomers ($query, int $limit = 10):obj
line 33
Zoekt naar klanten in Shopify op basis van een zoekopdracht en een optionele limiet voor het aantal geretourneerde resultaten.
if ($m = $this->missing('shop_domain', 'access_token')) return $m
return $this->get('customers/search.json', ['query' => $query, 'limit' => $limit])method
%Shopify -> customer ($id):obj
line 38
Haalt klantinformatie op uit Shopify met behulp van de opgegeven klant-ID.
if ($m = $this->missing('shop_domain', 'access_token')) return $m
return $this->get('customers/'.$id.'.json')method
%Shopify -> orders (array $query = []):obj
line 43
Haal een lijst van bestellingen op uit Shopify op basis van de opgegeven queryparameters.
if ($m = $this->missing('shop_domain', 'access_token')) return $m
return $this->get('orders.json', $query)method
%Shopify -> products (array $query = []):obj
line 48
Haalt een lijst van producten op uit Shopify met de opgegeven queryparameters.
if ($m = $this->missing('shop_domain', 'access_token')) return $m
return $this->get('products.json', $query)method
%Shopify -> createDraftOrder (array $order):obj
line 53
Maakt een conceptorder aan in Shopify met de opgegeven orderdetails.
if ($m = $this->missing('shop_domain', 'access_token')) return $m
return $this->post('draft_orders.json', ['draft_order' => $order])method
%Shopify -> createProduct (array $product):obj
line 58
Maakt een nieuw product aan in Shopify met de opgegeven productdetails.
if ($m = $this->missing('shop_domain', 'access_token')) return $m
return $this->post('products.json', ['product' => $product])method
%Shopify -> setInventory ($inventoryItemId, $locationId, int $available):obj
line 63
Stelt het beschikbare voorraadniveau in voor een specifiek voorraaditem op een bepaalde locatie in Shopify.
if ($m = $this->missing('shop_domain', 'access_token')) return $m
return $this->post('inventory_levels/set.json', ['inventory_item_id' => $inventoryItemId, 'location_id' => $locationId, 'available' => $available])object
%Slack
/phlo/resources/connectors/chat/Slack.phlo
const
Slack :: section
line 12
Maakt een sectieblok in een Slack-bericht, waarmee tekst en andere elementen kunnen worden opgenomen.
'Slack'const
Slack :: api
line 13
Dit item biedt toegang tot de Slack API, waarmee integratie met Slack-diensten en functionaliteiten mogelijk is.
'https://slack.com/api'method
%Slack -> headers:array
line 15
Geeft de headers terug die nodig zijn voor authenticatie bij het maken van verzoeken aan de Slack API met een bearer token.
[static::bearer($this->config['bot_token'] ?? void)]static
Slack :: fields:array
line 17
Definieert de configuratievelden voor integratie met Slack, inclusief de bot-token, handtekeningsecreet en vereiste scopes.
arr(
section: 'Slack',
secret: arr(
bot_token: 'Bot user OAuth token (xoxb-...)',
signing_secret: 'Signing secret for inbound webhook verification (optional)',
),
scopes: 'chat:write, channels:history, channels:read',
)method
%Slack -> result (obj $res):obj
line 26
Verwerkt het resultaat van een Slack API-aanroep en retourneert de respons als deze succesvol is of een foutmelding als er een fout is opgetreden.
if (!$res->ok) return $res
$data = $res->data
if (is_object($data) && ($data->ok ?? null) === false) return static::fail($data->error ?? 'Slack API error', $res->status)
return $resmethod
%Slack -> send ($channel, $text, array $extra = []):obj
line 33
Verzendt een bericht naar een opgegeven Slack-kanaal met behulp van de Slack API. Het vereist een geconfigureerde bot-token en accepteert aanvullende parameters via een array.
if (!$this->configured('bot_token')) return static::fail('Slack bot_token not configured')
return $this->result($this->post('chat.postMessage', ['channel' => $channel, 'text' => $text] + $extra))method
%Slack -> history ($channel, int $limit = 20):obj
line 38
Haalt de berichtgeschiedenis op van een opgegeven Slack-kanaal, met een optionele limiet op het aantal geretourneerde berichten.
if (!$this->configured('bot_token')) return static::fail('Slack bot_token not configured')
return $this->result($this->get('conversations.history', ['channel' => $channel, 'limit' => $limit]))method
%Slack -> channels (int $limit = 100, string $types = 'public_channel'):obj
line 43
Haal een lijst van kanalen op uit Slack, met optionele parameters om het aantal kanalen te beperken en de types kanalen op te geven die moeten worden geretourneerd.
if (!$this->configured('bot_token')) return static::fail('Slack bot_token not configured')
return $this->result($this->get('conversations.list', ['limit' => $limit, 'types' => $types]))object
%Telegram
/phlo/resources/connectors/chat/Telegram.phlo
const
Telegram :: section
line 12
Definieert een sectie binnen een Telegram-resource, waardoor gerelateerde inhoud georganiseerd kan worden gegroepeerd.
'Telegram'method
%Telegram -> base:string
line 14
Stelt de basis-URL voor de Telegram Bot API samen met de opgegeven bot-token uit de configuratie.
'https://api.telegram.org/bot'.($this->config['bot_token'] ?? void)static
Telegram :: fields:array
line 16
Definieert de velden met betrekking tot de Telegram-configuratie, inclusief de bot-token en een optionele webhook-geheim voor verificatie.
arr(
section: 'Telegram',
secret: arr(
bot_token: 'Bot token from BotFather',
webhook_secret: 'Webhook secret token for inbound verification (optional)',
),
help: 'Create a bot via BotFather and store its token. The chat_id is the recipient or chat to message.',
)method
%Telegram -> result (obj $res):obj
line 25
Verwerkt het resultaat van een Telegram API-respons en retourneert de respons als deze succesvol is of een foutmelding als er een fout wordt gedetecteerd.
if (!$res->ok) return $res
$data = $res->data
if (is_object($data) && ($data->ok ?? null) === false) return static::fail($data->description ?? 'Telegram API error', $res->status)
return $resmethod
%Telegram -> send ($chatId, $text, array $extra = []):obj
line 32
Verzendt een bericht naar een opgegeven Telegram-chat met behulp van de opgegeven chat-ID en tekst, met optionele extra parameters.
if ($m = $this->missing('bot_token')) return $m
return $this->result($this->post('sendMessage', ['chat_id' => $chatId, 'text' => $text] + $extra))method
%Telegram -> photo ($chatId, $photo, $caption = void, array $extra = []):obj
line 37
Verzendt een foto naar een opgegeven Telegram-chat met een optionele bijschrift en extra parameters.
if ($m = $this->missing('bot_token')) return $m
$payload = ['chat_id' => $chatId, 'photo' => $photo]
if ($caption !== void) $payload['caption'] = $caption
return $this->result($this->post('sendPhoto', $payload + $extra))method
%Telegram -> document ($chatId, $document, $caption = void, array $extra = []):obj
line 44
Verzendt een document naar een opgegeven chat op Telegram, met optioneel een bijschrift en extra parameters.
if ($m = $this->missing('bot_token')) return $m
$payload = ['chat_id' => $chatId, 'document' => $document]
if ($caption !== void) $payload['caption'] = $caption
return $this->result($this->post('sendDocument', $payload + $extra))method
%Telegram -> updates (int $offset = 0, int $limit = 100):obj
line 51
Haal updates op van de Telegram bot API, met paginering via de parameters 'offset' en 'limit'.
if ($m = $this->missing('bot_token')) return $m
return $this->result($this->get('getUpdates', ['offset' => $offset, 'limit' => $limit]))object
%TokenStore
/phlo/resources/connectors/TokenStore.phlo
static
TokenStore :: path ($key):string
line 11
De TokenStore::$path-eigenschap definieert het bestandspad voor het opslaan van tokengegevens, geformatteerd als een JSON-bestand op basis van een gesaniteerde versie van de opgegeven sleutel.
data.'tokens/'.preg_replace('/[^a-z0-9_.-]+/i', us, (string)$key).'.json'static
TokenStore :: read ($key):array
line 13
Leest een token uit de TokenStore op basis van de sleutel en retourneert een array van tokens als het bestand bestaat en toegankelijk is.
$file = static::path($key)
if (!is_file($file)) return []
@chmod(data.'tokens', 0700)
@chmod($file, 0600)
return (array)json_read($file, true)static
TokenStore :: write ($key, array $token):void
line 21
Deze methode schrijft een token naar een specifiek bestand in een veilige map, waarbij ervoor wordt gezorgd dat de map en het bestand de juiste machtigingen hebben.
$dir = data.'tokens'
is_dir($dir) || mkdir($dir, 0700, true)
@chmod($dir, 0700)
$file = static::path($key)
json_write($file, $token)
@chmod($file, 0600)static
TokenStore :: valid (array $token):bool
line 30
Controleert of het toegangstoken geldig is door te verifiëren of het bestaat en niet is verlopen, met een buffer van 30 seconden voor de vervaldatum.
($token['access_token'] ?? void) !== void && (int)($token['expires_at'] ?? 0) > time() + 30static
TokenStore :: store ($res, $refresh):array
line 32
Slaat het toegangstoken, het vernieuwings-token en de vervaltijd op voor authenticatiedoeleinden.
$token = [
'access_token' => $res['access_token'],
'refresh_token' => $res['refresh_token'] ?? $refresh,
'expires_at' => time() + (int)($res['expires_in'] ?? 3600),
]
return $tokenstatic
TokenStore :: lock ($key)
line 44
Takes an exclusive lock around one key's refresh cycle.
$dir = data.'tokens'
is_dir($dir) || mkdir($dir, 0700, true)
$lock = @fopen(static::path($key).'.lock', 'c')
if (!$lock || !flock($lock, LOCK_EX)){
$lock && fclose($lock)
return null
}
return $lockstatic
TokenStore :: access ($key, $tokenUrl, $clientId, $clientSecret, array $seed = []):?string
line 55
Haal het toegangstoken op uit de TokenStore en vernieuw het indien nodig met behulp van het vernieuwings-token.
$token = static::read($key)
if (static::valid($token)) return $token['access_token']
$lock = static::lock($key)
if (!$lock) return null
try {
$token = static::read($key)
if (!($token['refresh_token'] ?? null) && ($seed['refresh_token'] ?? null)){
$token = ['refresh_token' => $seed['refresh_token']]
static::write($key, $token)
}
if (static::valid($token)) return $token['access_token']
$refresh = $token['refresh_token'] ?? null
if (!$refresh || !$tokenUrl || !$clientId) return null
$res = OAuth2::refresh($tokenUrl, $clientId, $clientSecret, $refresh)
if (!($res['access_token'] ?? null)) return null
$token = static::store($res, $refresh)
static::write($key, $token)
return $token['access_token']
} finally {
flock($lock, LOCK_UN)
fclose($lock)
}object
%Twilio
/phlo/resources/connectors/chat/Twilio.phlo
const
Twilio :: section
line 12
Definieert een sectie voor Twilio-integratie binnen een Phlo-toepassing.
'Twilio'method
%Twilio -> base:string
line 14
Bouwt de basis-URL voor toegang tot de Twilio API met de account SID uit de configuratie.
'https://api.twilio.com/2010-04-01/Accounts/'.($this->config['account_sid'] ?? void)method
%Twilio -> headers:array
line 16
Haal de headers op die nodig zijn voor Twilio API-aanvragen met behulp van de opgegeven account SID en auth token uit de configuratie.
[static::basic($this->config['account_sid'] ?? void, $this->config['auth_token'] ?? void)]static
Twilio :: fields:array
line 18
Definieert de velden voor het configureren van Twilio-integratie, inclusief account SID, afzendernummer en optionele messaging service SID, samen met het authenticatietoken.
arr(
section: 'Twilio',
config: arr(
account_sid: 'Account SID (ACxxxx)',
from_number: 'Sender number in E.164, e.g. +31600000000 (use this or messaging_service_sid)',
messaging_service_sid: 'Messaging Service SID (optional alternative to from_number)',
),
secret: arr(auth_token: 'Auth token'),
)method
%Twilio -> sms ($to, $body, array $extra = []):obj
line 28
Verzendt een SMS-bericht met behulp van de Twilio API, waarbij ofwel een from_number of messaging_service_sid uit de configuratie vereist is.
if ($m = $this->missing('account_sid', 'auth_token')) return $m
$from = $this->config['from_number'] ?? void
$service = $this->config['messaging_service_sid'] ?? void
if ($from === void && $service === void) return static::fail('Twilio from_number or messaging_service_sid required')
$fields = ['To' => $to, 'Body' => $body] + $extra
if ($service !== void) $fields['MessagingServiceSid'] = $service
else $fields['From'] = $from
return $this->form('Messages.json', $fields)method
%Twilio -> message ($sid):obj
line 39
Haalt een bericht op van Twilio met de opgegeven message SID.
if ($m = $this->missing('account_sid', 'auth_token')) return $m
return $this->get('Messages/'.$sid.'.json')Laatst bijgewerkt op 07-08-2026