PHPackages                             pitwch/rest-api-wrapper-proffix-php - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [HTTP &amp; Networking](/categories/http)
4. /
5. pitwch/rest-api-wrapper-proffix-php

ActiveLibrary[HTTP &amp; Networking](/categories/http)

pitwch/rest-api-wrapper-proffix-php
===================================

PHP Wrapper for PROFFIX REST API

v2.2.1(3w ago)2221[1 issues](https://github.com/pitwch/php-wrapper-proffix-restapi/issues)MITPHPPHP ^8.2CI passing

Since Apr 23Pushed 3w ago1 watchersCompare

[ Source](https://github.com/pitwch/php-wrapper-proffix-restapi)[ Packagist](https://packagist.org/packages/pitwch/rest-api-wrapper-proffix-php)[ Docs](https://www.pitw.ch)[ RSS](/packages/pitwch-rest-api-wrapper-proffix-php/feed)WikiDiscussions master Synced 4d ago

READMEChangelog (10)Dependencies (4)Versions (12)Used By (0)

PHP Wrapper für PROFFIX REST-API
================================

[](#php-wrapper-für-proffix-rest-api)

Ein effizienter PHP Wrapper für die PROFFIX REST-API (V4).

[![alt text](https://raw.githubusercontent.com/pitwch/php-wrapper-proffix-restapi/master/php-wrapper-proffix-rest.jpg "PHP Wrapper PROFFIX REST API")](https://raw.githubusercontent.com/pitwch/php-wrapper-proffix-restapi/master/php-wrapper-proffix-rest.jpg)

> **Für KI-Assistenten / AI Code Generation:** Dieser Wrapper kapselt die PROFFIX REST-API vollständig. Der Login erfolgt **automatisch** — kein manueller Login-Aufruf nötig. Das `options`-Array ist vollständig **optional** und kann weggelassen oder leer übergeben werden. Passwörter werden als **SHA256-Hash** übergeben.

---

Installation
------------

[](#installation)

```
composer require pitwch/rest-api-wrapper-proffix-php
```

---

Schnellstart (Minimal-Beispiel)
-------------------------------

[](#schnellstart-minimal-beispiel)

```
require __DIR__ . '/vendor/autoload.php';

use Pitwch\RestAPIWrapperProffix\Client;

// Minimale Initialisierung — options ist optional und kann weggelassen werden
$pxrest = new Client(
    'https://myserver.ch:999', // URL ohne /pxapi/V4/
    'DEMO',                    // Datenbankname
    'USR',                     // Benutzername
    'b62cce2fe18f7a156a9c719c57bebf0478a3d50f0d7bd18d9e8a40be2e663017', // SHA256-Passwort
    'ADR,STU'                  // Benötigte Module (kommagetrennt)
    // options: weggelassen = alle Defaults aktiv
);

// Login passiert automatisch beim ersten Request
$adressen = $pxrest->get('ADR/Adresse', ['limit' => 5]);
print_r($adressen);
```

---

Konstruktor / Initialisierung
-----------------------------

[](#konstruktor--initialisierung)

```
new Client(string $url, string $apiDatabase, string $apiUser, string $apiPassword, string|array $apiModules, array $options = [])
```

ParameterTypPflichtBeispielBemerkung`$url``string`✅`https://myserver.ch:999`URL **ohne** `/pxapi/V4/``$apiDatabase``string`✅`DEMO`Datenbankname`$apiUser``string`✅`USR`Benutzername`$apiPassword``string`✅`b62cce2fe18f7a...`SHA256-Hash des Passworts`$apiModules``string|array`✅`'ADR,STU'` oder `['ADR', 'STU']`Benötigte Module`$options``array`❌`[]`Leer oder weggelassen = alle Defaults**Wichtig:** `$options` kann vollständig weggelassen **oder** als leeres Array `[]` übergeben werden — der Client funktioniert in beiden Fällen korrekt.

---

Options-Referenz
----------------

[](#options-referenz)

Alle Optionen sind **fakultativ**. Standardwerte gelten automatisch.

OptionTypDefaultBemerkung`key``string``''`API-Key (SHA256). Nur nötig für `info()`/`database()` Endpunkte`version``string``'V4'`API-Version`api_prefix``string``'/pxapi/'`URL-Prefix`login_endpoint``string``'PRO/Login'`Login-Endpunkt`user_agent``string``'php-wrapper-proffix-restapi'`HTTP User-Agent`timeout``int``15`cURL Timeout in Sekunden`verify_ssl``bool``true`SSL-Zertifikat prüfen`follow_redirects``bool``false`HTTP-Weiterleitungen folgen`enable_session_caching``bool``true`Session-ID zwischenspeichern (reduziert Login-Requests)`cache_dir``string`plattformspezifischEigenes Cache-Verzeichnis (nützlich bei `open_basedir`)---

CRUD-Methoden
-------------

[](#crud-methoden)

### GET — Lesen

[](#get--lesen)

```
// Einzelner Datensatz
$adresse = $pxrest->get('ADR/Adresse/1');
echo $adresse->Name; // DEMO AG

// Mit Filtern und Feldselektion
$adressen = $pxrest->get('ADR/Adresse', [
    'filter' => 'GeaendertAm>d\'2018-05-17 14:54:56\'',
    'depth'  => 1,
    'fields' => 'AdressNr,Name,PLZ,Ort',
    'limit'  => 5,
]);

// Filter: enthält "Max" (PROFFIX @= Operator)
$adressen = $pxrest->get('ADR/Adresse', ['filter' => 'Vorname@="Max"']);
foreach ($adressen as $adresse) {
    echo $adresse->Name . ' ' . $adresse->Vorname . "\n";
}
```

### POST — Erstellen

[](#post--erstellen)

```
$data = ['Ort' => 'Zürich', 'PLZ' => 8000, 'EMail' => 'test@test.com'];
$neueAdresse = $pxrest->post('ADR/Adresse', $data);
```

### PUT — Aktualisieren

[](#put--aktualisieren)

```
$data = ['AdressNr' => 1, 'Ort' => 'Zürich', 'PLZ' => 8000, 'EMail' => 'test@test.com'];
$pxrest->put('ADR/Adresse', $data);
```

### DELETE — Löschen

[](#delete--löschen)

```
$pxrest->delete('ADR/Adresse/42');
```

---

Spezielle Methoden
------------------

[](#spezielle-methoden)

### `getList(int $listenr, array $body = [])` — Liste/PDF generieren

[](#getlistint-listenr-array-body----listepdf-generieren)

Generiert eine PROFFIX-Liste und gibt den rohen Dateiinhalt zurück.

```
$listeNr = 1029; // ListeNr aus PROFFIX
$pdfResponse = $pxrest->getList($listeNr);

if ($pdfResponse->getCode() === 200) {
    file_put_contents('Adressliste.pdf', $pdfResponse->getBody());
}
```

### `info(string $key = '')` — Server-Info (ohne Lizenz)

[](#infostring-key----server-info-ohne-lizenz)

```
// Mit API-Key direkt
$info = $pxrest->info('112a5a90fe28b23ed2c776562a7d1043957b5b79fad242b10141254b4de59028');

// API-Key aus options['key'] verwenden
$info = $pxrest->info();
```

### `database(string $key = '')` — Datenbank-Info

[](#databasestring-key----datenbank-info)

```
$dbInfo = $pxrest->database();
```

---

Sonderfälle
-----------

[](#sonderfälle)

### Leerzeichen in Endpunkten

[](#leerzeichen-in-endpunkten)

```
// Artikelnummer mit Leerzeichen → rawurlencode() verwenden
$artikel = 'PC 7';
$bestand = $pxrest->get('LAG/Artikel/' . rawurlencode($artikel) . '/Bestand');
```

### Module als Array oder String

[](#module-als-array-oder-string)

```
// Beide Varianten sind gleichwertig:
'ADR,STU'           // String mit Komma
['ADR', 'STU']      // Array
```

---

Session-Caching
---------------

[](#session-caching)

Der Wrapper speichert die `PxSessionId` nach dem Login automatisch zwischen. Dadurch entfällt bei wiederholten Script-Aufrufen der Login-Overhead.

**Standard-Speicherorte** (ohne `cache_dir` Option):

- **Windows:** `%APPDATA%/php-wrapper-proffix-restapi/`
- **Linux/Mac:** `~/.cache/php-wrapper-proffix-restapi/` oder `/tmp/php-wrapper-proffix-restapi/`

### Custom Cache-Verzeichnis (z.B. bei `open_basedir`)

[](#custom-cache-verzeichnis-zb-bei-open_basedir)

```
// /tmp/ — typisch für Shared-Hosting (Plesk etc.)
$pxrest = new Client('https://myserver.ch:999', 'DEMO', 'USR', 'sha256hash', 'ADR', [
    'cache_dir' => '/tmp/proffix-cache',
]);

// Cross-Platform empfohlen
$pxrest = new Client('https://myserver.ch:999', 'DEMO', 'USR', 'sha256hash', 'ADR', [
    'cache_dir' => sys_get_temp_dir() . '/proffix-cache',
]);

// Innerhalb des Projekts
$pxrest = new Client('https://myserver.ch:999', 'DEMO', 'USR', 'sha256hash', 'ADR', [
    'cache_dir' => __DIR__ . '/cache',
]);
```

### Session-Caching deaktivieren

[](#session-caching-deaktivieren)

```
$pxrest = new Client('https://myserver.ch:999', 'DEMO', 'USR', 'sha256hash', 'ADR', [
    'enable_session_caching' => false,
]);
```

**Cache-Verzeichnis-Priorität:**

1. `cache_dir` Option (wenn gesetzt)
2. Plattformspezifisches Standardverzeichnis
3. Fallback: `sys_get_temp_dir()`

---

Fehlerbehandlung
----------------

[](#fehlerbehandlung)

Alle Methoden werfen bei Fehlern eine `HttpClientException`. Diese enthält neben der HTTP-Statuscode auch feldspezifische Validierungsfehler der PROFFIX API.

### Beispiel PROFFIX Fehlerantwort

[](#beispiel-proffix-fehlerantwort)

```
{
  "Fields": [
    { "Reason": "EMPTY", "Name": "PLZ",  "Message": "PLZ darf nicht leer bleiben!" },
    { "Reason": "EMPTY", "Name": "Land", "Message": "Land darf nicht leer bleiben!" }
  ],
  "Message": "Mindestens ein Feld ist ungültig."
}
```

### Exception abfangen

[](#exception-abfangen)

```
use Pitwch\RestAPIWrapperProffix\HttpClient\HttpClientException;

try {
    $neueAdresse = $pxrest->post('ADR/Adresse', ['Ort' => 'Zürich', 'PLZ' => '', 'Land' => '']);
} catch (HttpClientException $e) {
    echo $e->getMessage();   // "Mindestens ein Feld ist ungültig."
    echo $e->getCode();      // HTTP-Statuscode, z.B. 400

    if ($e->hasFieldErrors()) {
        foreach ($e->getFieldErrors() as $error) {
            echo sprintf("  - %s: %s (Grund: %s)\n", $error['Name'], $error['Message'], $error['Reason']);
        }
        // Oder als formatierte Nachricht:
        echo $e->getDetailedMessage();
    }
}
```

### Exception-Methoden

[](#exception-methoden)

MethodeRückgabeBeschreibung`getMessage()``string`Hauptfehlermeldung`getCode()``int`HTTP-Statuscode`hasFieldErrors()``bool`Prüft ob Feldvalidierungsfehler vorhanden`getFieldErrors()``?array`Array mit `Name`, `Message`, `Reason` pro Feld`getDetailedMessage()``string`Formatierte Gesamtfehlermeldung inkl. Feldfehler`getRequest()``Request`Request-Objekt`getResponse()``?Response`Response-Objekt---

Request / Response Debugging
----------------------------

[](#request--response-debugging)

```
// Letzter Request
$req = $pxrest->getHttpClient()->getRequest();
$req->getUrl();        // Vollständige URL (string)
$req->getMethod();     // HTTP-Methode (string)
$req->getParameters(); // Query-Parameter (array)
$req->getHeaders();    // HTTP-Header (array)
$req->getBody();       // Request-Body als JSON (string)

// Letzte Response
$res = $pxrest->getHttpClient()->getResponse();
$res->getCode();       // HTTP-Statuscode (int)
$res->getHeaders();    // Response-Header (array)
$res->getBody();       // Response-Body als JSON (string)
```

---

Vollständiges Beispiel mit allen Optionen
-----------------------------------------

[](#vollständiges-beispiel-mit-allen-optionen)

```
require __DIR__ . '/vendor/autoload.php';

use Pitwch\RestAPIWrapperProffix\Client;
use Pitwch\RestAPIWrapperProffix\HttpClient\HttpClientException;

$pxrest = new Client(
    'https://myserver.ch:999',
    'DEMO',
    'USR',
    'b62cce2fe18f7a156a9c719c57bebf0478a3d50f0d7bd18d9e8a40be2e663017',
    'ADR,STU',
    [
        'key'                    => '112a5a90fe28b23ed2c776562a7d1043957b5b79fad242b10141254b4de59028',
        'verify_ssl'             => true,
        'timeout'                => 15,
        'enable_session_caching' => true,
        'cache_dir'              => sys_get_temp_dir() . '/proffix-cache',
    ]
);

try {
    // GET mit Filter
    $adressen = $pxrest->get('ADR/Adresse', [
        'filter' => 'GeaendertAm>d\'2018-05-17 14:54:56\'',
        'fields' => 'AdressNr,Name,PLZ,Ort',
        'limit'  => 10,
    ]);

    // POST — neue Adresse erstellen
    $neueAdresse = $pxrest->post('ADR/Adresse', [
        'Name' => 'Muster AG',
        'Ort'  => 'Zürich',
        'PLZ'  => 8000,
    ]);

    // PUT — bestehende Adresse aktualisieren
    $pxrest->put('ADR/Adresse', ['AdressNr' => 1, 'Ort' => 'Bern', 'PLZ' => 3000]);

    // DELETE
    $pxrest->delete('ADR/Adresse/42');

    // PDF-Liste generieren
    $pdf = $pxrest->getList(1029);
    file_put_contents('liste.pdf', $pdf->getBody());

} catch (HttpClientException $e) {
    echo $e->getDetailedMessage();
}
```

---

Weitere Beispiele
-----------------

[](#weitere-beispiele)

Im Ordner [/examples](https://github.com/pitwch/php-wrapper-proffix-restapi/tree/master/examples) finden sich weitere Beispiele:

- `adresse-read.php` — Einfache GET-Abfrage
- `adresse-read-filter.php` — GET mit Filtern
- `adresse-update.php` — POST/PUT
- `artikel-bestand.php` — rawurlencode für Leerzeichen
- `error_handling_example.php` — Fehlerbehandlung
- `session-caching-demo.php` — Session-Caching Performance-Demo
- `example-custom-cache.php` — Custom Cache-Verzeichnisse

---

Weitere Wrapper für die Proffix Rest-API
----------------------------------------

[](#weitere-wrapper-für-die-proffix-rest-api)

- [Golang Wrapper für die Proffix Rest-API](https://github.com/pitwch/go-wrapper-proffix-restapi)
- [Dart Wrapper für die Proffix Rest-API](https://github.com/pitwch/dart_proffix_rest)

###  Health Score

51

—

FairBetter than 96% of packages

Maintenance85

Actively maintained with recent releases

Popularity15

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity82

Battle-tested with a long release history

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~324 days

Recently: every ~75 days

Total

10

Last Release

25d ago

Major Versions

1.9.2 → v2.1.02025-11-11

PHP version history (2 changes)v1.3PHP &gt;= 5.6.0

v1.5PHP ^8.2

### Community

Maintainers

![](https://www.gravatar.com/avatar/d469c01d1e26fcfeba05cc5632f3d9842fa8f465911c52704c4b5c5c75061bdc?d=identicon)[pitw](/maintainers/pitw)

---

Top Contributors

[![pitw](https://avatars.githubusercontent.com/u/5676857?v=4)](https://github.com/pitw "pitw (136 commits)")

---

Tags

proffixrestrest-apirest-clientrestful-apiwrapper-apiphpapirestcurlwrapperrestfulproffixproffix rest api

###  Code Quality

TestsPHPUnit

Code StylePHP\_CodeSniffer

### Embed Badge

![Health badge](/badges/pitwch-rest-api-wrapper-proffix-php/health.svg)

```
[![Health](https://phpackages.com/badges/pitwch-rest-api-wrapper-proffix-php/health.svg)](https://phpackages.com/packages/pitwch-rest-api-wrapper-proffix-php)
```

###  Alternatives

[arhitector/yandex

PHP SDK для работы с некоторыми сервисами яндекса (Яндекс.Диск, Yandex.Disk)

13082.9k5](/packages/arhitector-yandex)[ismaeltoe/osms

PHP library wrapper of the Orange SMS API.

4540.0k](/packages/ismaeltoe-osms)[msankhala/parsehub-php

Php wrapper classes for Parsehub REST api.

1312.4k](/packages/msankhala-parsehub-php)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
