Giter VIP home page Giter VIP logo

forrest's Introduction

Omniphx/Forrest, Force.com REST API Client for Laravel

Latest Stable Version Total Downloads Latest Unstable Version License Build Status

Salesforce/Force.com REST API client for Laravel. It provides access to restricted Salesforce information via Oauth 2.0. REST is a lightweight alternative to the SOAP API and is useful for mobile users.

While this package is built for Laravel, it has been decoupled so that it can be extended into any framework or vanilla PHP application.

Installation

If you are upgrading to Version 1.0, be sure to re-publish your config file.

Forrest can be installed through composer. Open your composer.json file and add the following to the require key:

"omniphx/forrest": "1.*"

Next run composer update from the command line to install the package.

If you are using Laravel, add the service provider to your app/config/app.php file:

'Omniphx\Forrest\Providers\Laravel\ForrestServiceProvider'

Followed by the alias:

'Forrest' => 'Omniphx\Forrest\Providers\Laravel\Facades\Forrest'

Configuration

You will need a configuration file to add your credentials. Publish a config file using the artisan command:

php artisan config:publish omniphx/forrest

You can find the config file in: app/config/omniphx/forrest/config.php

After you have set up am connected app (see below), update your config file with a consumerKey, consumerSecret, loginURL and callbackURI.

Getting Started

Setting up a Connected App

  1. Log into to your Salesforce org
  2. Click on Setup in the upper right-hand menu
  3. Under Build click Create > Apps
  4. Scroll to the bottom and click New under Connected Apps.
  5. Enter the following details for the remote application:
    • Connected App Name
    • API Name
    • Contact Email
    • Enable OAuth Settings under the API dropdown
    • Callback URL
    • Select access scope (If you need a refresh token, specify it here)
  6. Click Save

After saving, you will now be given a Consumer Key and Consumer Secret. Add those to your config file.

Setup

Forrest will come with the following routes included in it's package.

Feel free to overwrite these routes in routes.php. They can be called anything you like, but the callback must match what is configured in your config file and Connected App settings for your Salesforce org.

Web Server authentication flow
Route::get('/authenticate', function()
{
    return Forrest::authenticate();
});

Route::get('/callback', function()
{
    Forrest::callback();

    $url = Config::get('forrest::authRedirect');

    return Redirect::to($url);
});
Username-Password authentication flow
Route::get('/authenticate', function()
{
    Forrest::authenticate();

    $url = Config::get('forrest::authRedirect');

    return Redirect::to($url);
});

With the Username Password flow, you can directly authenticate with the Forrest::authenticate() method. The routing provides backwards compatability with the Web Server flow if you switch between the two.

Custom login urls

Sometimes users will need to connect to a sandbox or custom url. To do this, simply pass the url as an argument for the authenticatation method:

Route::get('/authenticate', function()
{
    $loginURL = 'https://test.salesforce.com';

    return Forrest::authenticate($loginURL);
});

Usage

Query a record

The callback function will store an encrypted authentication token in the user's session which can now be used to make API requests such as:

Forrest::query('SELECT Id FROM Account');

Result:

{
    "totalSize": 2,
    "done": true,
    "records": [
        {
            "attributes": {
                "type": "Account",
                "url": "\/services\/data\/v30.0\/sobjects\/Account\/001i000000xxx"
            },
            "Id": "001i000000xxx"
        },
        {
            "attributes": {
                "type": "Account",
                "url": "\/services\/data\/v30.0\/sobjects\/Account\/001i000000xxx"
            },
            "Id": "001i000000xxx"
        }
    ]
}

The default format is JSON, but it can be changed to XML

If you are querying more than 2000 records, you response will include:

"nextRecordsUrl" : "/services/data/v20.0/query/01gD0000002HU6KIAW-2000"

Simply, call Forrest::next($nextRecordsUrl) to return the next 2000 records.

Create a new record

Records can be created using the following format.

$body = ['Name' => 'New Account'];
Forrest::sobjects('Account',[
    'method' => 'post',
    'body'   => $body]);

Update a record

Update a record with the PUT method.

$body = [
    'Name'  => 'Acme'
    'Phone' => '555-555-5555'];

Forrest::sobjects('Account/001i000000xxx',[
    'method' => 'put',
    'body'   => $body]);

Upsert a record

Update a record with the PATCH method and if the external Id doesn't exist, it will insert a new record.

$body = [
    'Phone' => '555-555-5555',
    'External_Id__c' => 'XYZ1234'];

Forrest::sobjects('Account',[
    'method' => 'patch',
    'body'   => $body]);

Delete a record

Delete a record with the DELETE method.

Forrest::sobjects('Account/001i000000xxx', ['method' => 'delete']);

XML format

Change the request/response format to XML with the format key or make it default in your config file.

Forrest::describe('Account',['format'=>'xml']);

API Requests

With the exception of the search and query resources, all requests are made dynamically using method overloading. The available resources are stored in the user's session when they are authenticated.

First, determine which resources you have access to by calling:

Forrest::resources();

This is a sample returned array:

Array
(
    [sobjects] => /services/data/v30.0/sobjects
    [connect] => /services/data/v30.0/connect
    [query] => /services/data/v30.0/query
    [theme] => /services/data/v30.0/theme
    [queryAll] => /services/data/v30.0/queryAll
    [tooling] => /services/data/v30.0/tooling
    [chatter] => /services/data/v30.0/chatter
    [analytics] => /services/data/v30.0/analytics
    [recent] => /services/data/v30.0/recent
    [process] => /services/data/v30.0/process
    [identity] => https://login.salesforce.com/id/00Di0000000XXXXXX/005i0000000aaaaAAA
    [flexiPage] => /services/data/v30.0/flexiPage
    [search] => /services/data/v30.0/search
    [quickActions] => /services/data/v30.0/quickActions
    [appMenu] => /services/data/v30.0/appMenu
)

Next, you can call resources by referring to the specified key. For instance:

Forrest::theme();

or

Forrest::appMenu();

Resource urls can be extended by passing additional parameters into the first argument:

Forrest::sobjects('Account/describe/approvalLayouts/');

You can also add optional parameters to requests:

Forrest::theme(['format'=>'xml']);

Additional API Requests

Refresh

If a refresh token is set, the server can refresh the access token on the user's behalf. Refresh tokens are only provided if you use the Web Server flow.

Forrest::refresh();

If you need a refresh token, be sure to specify this under access scope in your Connected App. You can also specify this in your configuration file by adding 'scope' => 'full refresh_token'. Setting scope access in the config file is optional, the default scope access is determined by your Salesforce org.

Revoke

This will revoke the authorization token. The session will continue to store a token, but it will become invalid.

Forrest::revoke();

Versions

Returns all currently supported versions. Includes the verison, label and link to each version's root:

Forrest::versions();

Resources

Returns list of available resources for a specific API.

Forrest::resources();

Identity

Returns information about the logged-in user.

Forrest::identity();

Limits

Lists information about organizational limits. Available for API version 29.0 and later.

Note: this call is part of a pilot program and may not be availabe to all orgs without a request to Salesforce.

Forrest::limits();

Describe

Describes all global objects availabe in the organization.

Forrest::describe();

Query

Returns results for a specified SOQL query.

Forrest::query('SELECT Id FROM Account');

Query Explain

Returns details of how Salesforce will process your query. Available for API verison 30.0 or later.

Forrest::queryExplain('SELECT Id FROM Account');

Query All

Returns results for a specified SOQL query, but will also inlcude deleted records.

Forrest::queryAll('SELECT Id FROM Account');

Search

Returns the specified SOSL query

Forrest::search('Find {foo}');

Scope Order

Global search keeps track of which objects the user interacts with and arranges them when the user performs a global search. This call will return this ordered list of objects.

Forrest::scopeOrder();

Search Layouts

Returns the search results layout for the objects in the query string. List should be formatted as a string, but delimited by a comma.

Forrest::searchLayouts('Account,Contact,Lead');

Suggested Articles

Returns a list of Salesforce Knowledge articles based on the a search query. Pass additional parameters into the second argument. Available for API verison 30.0 or later.

Salesforce Knowledge must be enabled for this to work.

Forrest::suggestedArticles('foo', [
    'parameters' => [
        'channel' => 'App',
        'publishStatus' => 'Draft']]);

Suggested Queries

Returns a list of suggested searches based on a search text query. Matches search queries that other users have performed in Salesforce Knowledge. Like Suggest Articles, additional parameters can be passed into the second argument with the parameters key. Available for API version 30.0 or later.

Forrest::suggestedQueries('app, [
    'parameters' => ['foo' => 'bar']]);

For a complete listing of API resources, refer to the Force.com REST API Developer's Guide

Custom Apex endpoints

If you create a custom API using Apex, you can use the custom() method for consuming them.

Forrest::custom('/myEndpoint');

Additional options and parameters can be passed in like this:

Forrest::custom('/myEndpoint', [
    'method' => 'post',
    'body' => ['foo' => 'bar'],
    'parameters' => ['flim' => 'flam']]);

Read Creating REST APIs using Apex REST for more information.

Raw Requests

You can always make raw requests if one of the above methods doesn't meet your needs (which is unlikely)

Forrest::get('/services/data/v20.0/endpoint');
Forrest::head('/services/data/v20.0/endpoint');
Forrest::post('/services/data/v20.0/endpoint', ['my'=>'param']);
Forrest::put('/services/data/v20.0/endpoint', ['my'=>'param']);
Forrest::patch('/services/data/v20.0/endpoint', ['my'=>'param']);
Forrest::delete('/services/data/v20.0/endpoint');

Raw response output

By default, this package will return the body of a response as either a deserialized JSON object or a SimpleXMLElement object.

There might be times, when you would rather handle this differently. To do this, simply use any format other than 'json' or 'xml' and the code will return a Guzzle response object.

$response = Forrest::sobjects($resource, ['format'=> 'none']);
$content = (string) $response->getBody(); // Guzzle response

For more information about Guzzle responses, see their (documentation)[http://guzzle.readthedocs.org/en/latest/http-messages.html#responses].

Event Listener

Event::listen('forrest.response', function($request, $response) {
    dd((string) $response);
});

forrest's People

Contributors

omniphx avatar rtconner avatar bitdeli-chef avatar clemblanco avatar toddmcbrearty avatar

Watchers

Benji Schwartz-Gilbert avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.