PHPackages                             amx/salesforce - 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. [API Development](/categories/api)
4. /
5. amx/salesforce

ActiveLibrary[API Development](/categories/api)

amx/salesforce
==============

A salesforce integration package for Php applications.

0603PHP

Since Dec 21Pushed 6mo agoCompare

[ Source](https://github.com/DoITCloudConsulting/amx-salesforce)[ Packagist](https://packagist.org/packages/amx/salesforce)[ RSS](/packages/amx-salesforce/feed)WikiDiscussions main Synced 3w ago

READMEChangelogDependenciesVersions (1)Used By (0)

AMX Salesforce
==============

[](#amx-salesforce)

Este paquete proporciona una integración ligera con Salesforce para aplicaciones PHP usando la librería Omniphx/Forrest. Incluye:

- Un cliente (`SFClientService`) para ejecutar consultas SOQL, describir objetos y consumir la UI API.
- Clases base para representar objetos Salesforce (`SFBaseObject`) y traits generados con los campos.
- Una CLI embebida (`bin/salesforce`) con comandos para crear clases de objetos y sincronizar campos.

Este README explica cómo instalar y usar el paquete localmente, cómo configurar las credenciales y cómo usar los comandos `make-object` y `sync`.

Requisitos
----------

[](#requisitos)

- PHP 8.2+
- Composer
- Variables de entorno de Salesforce (ver sección `.env`)

Instalación (local / desarrollo)
--------------------------------

[](#instalación-local--desarrollo)

1. Clona el repositorio o agrega el paquete como dependencia en tu proyecto.

Si trabajas directamente en este repositorio (instalación local):

```
# desde la carpeta donde está este repo
composer install
```

Si quieres probarlo desde otro proyecto, añade la dependencia a `composer.json` de ese proyecto o usa `path`/`repositories` para apuntar al repositorio local.

Ejemplo de `repositories` en `composer.json` (útil para desarrollo local cuando tienes paquetes locales). Usa una ruta relativa o absoluta que apunte al directorio del paquete:

```
"repositories": [
  {
    "type": "path",
    "url": "../amx-salesforce"
  }
]
```

Con esto configurado en el `composer.json` del proyecto consumidor, puedes requerir el paquete localmente con:

```
composer require amx/salesforce:@dev
```

Alternativamente añade manualmente en `require` la línea `"amx/salesforce": "@dev"` y ejecuta `composer update`.

2. Asegúrate de instalar dependencias de paquetes (omniphx/forrest, symfony/console, vlucas/phpdotenv).
3. El paquete incluye un archivo binario `bin/salesforce` que levanta una pequeña aplicación console basada en Symfony Console y configura Forrest con las credenciales definidas en variables de entorno.

Configuración (.env)
--------------------

[](#configuración-env)

El CLI y el cliente esperan encontrar variables de entorno. Crea un archivo `.env` en el directorio desde donde ejecutarás `bin/salesforce` (normalmente la raíz del proyecto) con al menos estas variables:

```
SF_CONSUMER_KEY=your_consumer_key
SF_CONSUMER_SECRET=your_consumer_secret
SF_USERNAME=your_sf_username
SF_PASSWORD=your_sf_password
# Opcionales
SF_AUTH=UserPassword
SF_CALLBACK_URI=http://localhost/callback
SF_LOGIN_URL=https://login.salesforce.com

```

Se incluye un archivo de ejemplo `.env.example` en la raíz del repositorio; cópialo a `.env` y reemplaza los valores con tus credenciales:

```
cp .env.example .env
# editar .env con tus credenciales
```

En Windows puedes copiarlo con:

```
copy .env.example .env
```

El CLI y el cliente esperan encontrar variables de entorno. Crea un archivo `.env` en el directorio desde donde ejecutarás `bin/salesforce` (normalmente la raíz del proyecto) con al menos estas variables:

```
SF_CONSUMER_KEY=your_consumer_key
SF_CONSUMER_SECRET=your_consumer_secret
SF_USERNAME=your_sf_username
SF_PASSWORD=your_sf_password
# Opcionales
SF_AUTH=UserPassword
SF_CALLBACK_URI=http://localhost/callback
SF_LOGIN_URL=https://login.salesforce.com

```

Se incluye un archivo de ejemplo `.env.example` en la raíz del repositorio; cópialo a `.env` y reemplaza los valores con tus credenciales (ve arriba para el comando de copia).

El script `bin/salesforce` carga el `.env` y configura internamente Forrest antes de ejecutar los comandos.

Nota: guarda las credenciales con cuidado y usa mecanismos seguros para entornos de producción.

Uso del CLI
-----------

[](#uso-del-cli)

El binario expone dos comandos principales:

- `salesforce:make-object` (alias interno `amx-salesforce:make-object`): crea una clase PHP para un objeto Salesforce y un trait para los campos.
- `amx-salesforce:sync` (alias `salesforce:sync`): sincroniza los campos de un objeto Salesforce y escribe/actualiza el trait correspondiente con las propiedades tipadas.

Ejemplos:

```
# Ejecutar ayuda
php bin/salesforce list

# Crear un objeto custom (por defecto crea un Custom con sufijo __c)
php bin/salesforce salesforce:make-object Translations

# Crear un objeto Standard (pasa --standard)
php bin/salesforce salesforce:make-object Account --standard

# Sincronizar campos desde la API (describe)
php bin/salesforce amx-salesforce:sync Translations

# Sincronizar usando la UI API (mode=ui)
php bin/salesforce amx-salesforce:sync Account --mode=ui
```

Comportamiento rápido:

- `make-object` crea dos archivos si no existen:

    - `src/Objects/Custom/SF.php` o `src/Objects/Standard/SF.php`
    - `src/Traits/Custom/SFFields.php` o `src/Traits/Standard/SFFields.php`
- `sync` utiliza la clase existente del objeto (busca en Standard y luego en Custom). Crea el trait si no existe y actualiza sus propiedades con los campos obtenidos desde Salesforce (filtrando campos no applicable, mapeando tipos a tipos PHP básicos nullable).

Uso desde PHP (SFClientService y SFBaseObject)
----------------------------------------------

[](#uso-desde-php-sfclientservice-y-sfbaseobject)

El paquete expone `Amx\Salesforce\SFClientService` como cliente central. Ejemplos de uso:

```
use Amx\Salesforce\SFClientService;

$client = new SFClientService();

# Consultas SOQL construidas
$records = $client
    ->select(['Id', 'Name'])
    ->from('Account')
    ->where(['Name', 'LIKE', '%Acme%'])
    ->limit(10)
    ->execute();

# Describe un objeto
$describe = $client->describe('Account');

# Llamada a la UI API
$ui = $client->uiObjectInfo('Account');
```

SFBaseObject simplifica la representación de objetos Salesforce. Ejemplo con una clase generada `SFAccount`:

```
use Amx\Salesforce\Objects\Standard\SFAccount;

$account = new SFAccount();

# Buscar por Id
$res = $account->findById('001xx000003NGsYAAW', ['Id', 'Name', 'Phone']);

# Crear/actualizar
$account->Name = 'Acme Corp';
$result = $account->save();

# Sincronizar campos (puede invocarse desde CLI o directamente)
$fields = $account->sync('api');
```

### Patrones de uso de los objetos

[](#patrones-de-uso-de-los-objetos)

Las clases de objeto (`SFAccount`, `SFCase`, `SFTracker_Trade_Site`, etc.) están diseñadas para usarse en dos patrones principales:

1. Instanciar con datos y reutilizar la misma instancia

```
// Instancia y la carga con datos (por ejemplo, respuesta de la API)
$account = new SFAccount([
  'Id' => '001xx000003NGsYAAW',
  'Name' => 'Acme Corp',
  'Phone' => '555-1234'
]);

// Puedes llamar métodos sobre la misma instancia
$result = $account->save(); // update si tiene Id
$fields = $account->sync(); // sincroniza trait/propiedades si lo necesitas
```

2. Instanciar vacío y pasar datos después (útil para creación o uso puntual)

```
// Instancia vacía
$account = new SFAccount();

// Asignas propiedades manualmente o hidratas con un array
$account->Name = 'Nuevo Cliente';
$account->Phone = '555-9876';

$result = $account->save(); // crea nuevo registro si no tiene Id

// Alternativamente hidratar desde un array
$account->hydrate(['Name' => 'Empresa X', 'Phone' => '555-0000']);
$account->save();
```

Notas:

- `hydrate()` asigna valores a propiedades públicas existentes y también guarda todo en `$attributes`.
- `setClient()` permite inyectar un `SFClientService` compartido (útil para tests o para reutilizar una instancia mockeada):

```
use Amx\Salesforce\SFClientService;

$client = new SFClientService();
SFAccount::setClient($client);

# ahora todas las instancias usaran ese cliente compartido
$a = new SFAccount();
$a->findById(...);
```

Ejemplo concreto (dos formas equivalentes)

```
// Forma A: instanciar con datos y usar el método directamente
$tracker = new SFTracker_Trade_Site([
  'Name' => 'Trade Tracker',
  'Status__c' => 'Active'
]);
$response = $tracker->save(); // save() internamente llama a client->create cuando no hay Id

// Forma B: crear una instancia separada y pasar los datos a la instancia que ejecuta el método
$trackerData = new SFTracker_Trade_Site(['Name' => 'Trade Tracker']);
$response = (new SFTracker_Trade_Site())->hydrate($trackerData->toArray())->save();
```

Notas sobre el cliente:

- `ensureAuthenticated()` usa Forrest::authenticate(). El binario configura Forrest con las credenciales del `.env`.
- `execute()` construye la consulta SOQL internamente. Usa métodos encadenables: `select`, `from`, `where`, `orderBy`, `limit`.

Desarrollo y testing local
--------------------------

[](#desarrollo-y-testing-local)

- Instala dependencias: `composer install`.
- Ejecuta el CLI localmente desde la raíz del repo: `php bin/salesforce`.

Buenas prácticas y debugging
----------------------------

[](#buenas-prácticas-y-debugging)

- Asegúrate de que el `.env` esté en el directorio donde ejecutas `php bin/salesforce`.
- Si recibes errores de autenticación, revisa las variables `SF_CONSUMER_*`, `SF_USERNAME` y `SF_PASSWORD`.
- Para ver más información sobre la respuesta de Salesforce, puedes usar directamente `$client->query($soql)` o revisar `Forrest` logs.

Mapeo rápido de tipos
---------------------

[](#mapeo-rápido-de-tipos)

El comando `sync` mapeará tipos de Salesforce a tipos PHP nullable comunes (ej: `string`, `int`, `float`, `bool`) y generará propiedades públicas en el trait del objeto.

###  Health Score

22

—

LowBetter than 21% of packages

Maintenance47

Moderate activity, may be stable

Popularity16

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity13

Early-stage or recently created project

 Bus Factor1

Top contributor holds 85.7% 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.

### Community

Maintainers

![](https://www.gravatar.com/avatar/2ec69ca24c5233705c74f79142a59dcfba2b7f24d6e43cd8e90da55d81245303?d=identicon)[joelvegas20](/maintainers/joelvegas20)

---

Top Contributors

[![joelvegas20](https://avatars.githubusercontent.com/u/94265654?v=4)](https://github.com/joelvegas20 "joelvegas20 (12 commits)")[![AdielHdz](https://avatars.githubusercontent.com/u/121126966?v=4)](https://github.com/AdielHdz "AdielHdz (2 commits)")

### Embed Badge

![Health badge](/badges/amx-salesforce/health.svg)

```
[![Health](https://phpackages.com/badges/amx-salesforce/health.svg)](https://phpackages.com/packages/amx-salesforce)
```

###  Alternatives

[exsyst/swagger

A php library to manipulate Swagger specifications

35816.3M7](/packages/exsyst-swagger)[hubspot/api-client

Hubspot API client

24015.5M18](/packages/hubspot-api-client)[pocketmine/bedrock-protocol

An implementation of the Minecraft: Bedrock Edition protocol in PHP

172437.8k11](/packages/pocketmine-bedrock-protocol)[botman/driver-telegram

Telegram driver for BotMan

93452.6k6](/packages/botman-driver-telegram)

PHPackages © 2026

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