Reference
Facade, events, routes & commands
Everything the Laravel bridge adds, in one place: class names, signatures, properties, routes, columns and error messages, exactly as they are in the code. The guides explain when to use each piece.
Classes at a glance
| Class | Role |
|---|---|
Conceptlz\AdobeSign\Laravel\AdobeSignServiceProvider | Registers config, bindings, routes, publishable files and the command. Auto-discovered. |
Conceptlz\AdobeSign\Laravel\AdobeSignManager | Builds configured clients; forwards unknown calls to the default client. |
Conceptlz\AdobeSign\Laravel\Facades\AdobeSign | Facade over the manager, alias AdobeSign. |
Conceptlz\AdobeSign\Laravel\EloquentTokenStore | Core TokenStore backed by the token table. |
Conceptlz\AdobeSign\Laravel\Models\AdobeSignToken | Eloquent model for one stored token pair. |
Conceptlz\AdobeSign\Laravel\Events\OAuthConnected | A user finished connecting their account. |
Conceptlz\AdobeSign\Laravel\Events\WebhookReceived | A new webhook notification arrived. |
Conceptlz\AdobeSign\Laravel\Http\Controllers\OAuthController | The redirect and callback routes. |
Conceptlz\AdobeSign\Laravel\Http\Controllers\WebhookController | The webhook route (invokable). |
Conceptlz\AdobeSign\Laravel\Console\VerifyCommand | adobe-sign:verify. |
Conceptlz\AdobeSign\Laravel\MisconfiguredException | Config is missing something a feature needs. |
Facade methods
The facade's docblock declares these methods. The first group is defined on
AdobeSignManager; the second is forwarded through __call to the default client
(client()).
Manager methods
| Method | Returns | Notes |
|---|---|---|
client() | Conceptlz\AdobeSign\AdobeSign | Default client per adobe-sign.auth |
forUser(Authenticatable|string|int $user) | Conceptlz\AdobeSign\AdobeSign | OAuth client for one user; cached per key |
isConnected(Authenticatable|string|int $user) | bool | A token is stored; no API call |
oauth() | Conceptlz\AdobeSign\Auth\OAuthClient | Authorization-code flow client |
tokens() | Conceptlz\AdobeSign\Auth\TokenStore | The bound token store |
userKey(Authenticatable|string|int $user) | string | Token store key for a user |
webhookHandler() | Conceptlz\AdobeSign\Webhook\WebhookHandler | Allow-lists the configured client ids |
resolveUserKeyUsing(?callable $resolver) | void | Static; process-wide; null resets |
signatureLevel() | Conceptlz\AdobeSign\Enum\SignatureLevel | From adobe-sign.signature_level |
qualifiedIssuers() | list<string> | From adobe-sign.qualified_issuers |
signatureShortfalls(string $agreementId, ?SignatureLevel $required = null) | list<string> | Empty when every signer met the level |
Forwarded to the default client
| Method | Returns | Core docs |
|---|---|---|
asUser(string $user) | Conceptlz\AdobeSign\AdobeSign | Authentication |
agreements() | Conceptlz\AdobeSign\Resource\Agreements | Creating agreements, Managing agreements |
transientDocuments() | Conceptlz\AdobeSign\Resource\TransientDocuments | Uploading documents |
libraryDocuments() | Conceptlz\AdobeSign\Resource\LibraryDocuments | Other resources |
webhooks() | Conceptlz\AdobeSign\Resource\Webhooks | Webhooks |
users() | Conceptlz\AdobeSign\Resource\Users | Other resources |
widgets() | Conceptlz\AdobeSign\Resource\Widgets | Other resources |
megaSigns() | Conceptlz\AdobeSign\Resource\MegaSigns | Other resources |
Container bindings
| Abstract | Concrete | Lifetime |
|---|---|---|
AdobeSignManager | new AdobeSignManager($app, config('adobe-sign')) | scoped |
Conceptlz\AdobeSign\AdobeSign | AdobeSignManager::client() | bind (the manager caches the client) |
Conceptlz\AdobeSign\Auth\TokenStore | EloquentTokenStore | singleton, via bindIf |
The manager also uses a bound Psr\Http\Client\ClientInterface when one exists, the cache store from cache_store, and the log channel from log_channel.
Events
OAuthConnected
Conceptlz\AdobeSign\Laravel\Events\OAuthConnected, final, uses Dispatchable. Dispatched by the OAuth callback after the token is stored.
| Property | Type | Description |
|---|---|---|
$user | Illuminate\Contracts\Auth\Authenticatable | The signed-in user who connected |
$key | string | The token store key, from AdobeSignManager::userKey() |
$apiAccessPoint | ?string | The account's API host, e.g. https://api.eu1.adobesign.com/ |
WebhookReceived
Conceptlz\AdobeSign\Laravel\Events\WebhookReceived, final, uses Dispatchable. Dispatched by the webhook route once per new notification; duplicates are already dropped. Listeners doing real work should implement ShouldQueue.
| Property | Type | Description |
|---|---|---|
$event | Conceptlz\AdobeSign\Webhook\WebhookEvent | The parsed notification: AgreementEvent, MegaSignEvent, WidgetEvent, LibraryDocumentEvent or UnknownEvent. Fields are listed on the Webhooks page. |
Routes
| Name | Method | URI (default) | Middleware (default) | Action | Enabled by |
|---|---|---|---|---|---|
adobe-sign.oauth.redirect | GET | adobe-sign/oauth/redirect | web, auth | OAuthController@redirect | oauth.routes |
adobe-sign.oauth.callback | GET | adobe-sign/oauth/callback | web, auth | OAuthController@callback | oauth.routes |
adobe-sign.webhook | GET, POST | adobe-sign/webhook | none | WebhookController | webhooks.enabled |
Prefix, path and middleware come from oauth.route_prefix, oauth.route_middleware, webhooks.path and webhooks.middleware. Run php artisan route:list --name=adobe-sign to see them in your app.
Responses
| Route | Status | When |
|---|---|---|
| redirect | 302 | Always, to Adobe's consent page; state stored in session key adobe_sign_oauth_state |
| callback | 302 | Success; to oauth.redirect_after |
| callback | 400 | State mismatch (STATE_MISMATCH), no code (MISSING_CODE), or an untrusted api_access_point |
| callback | 403 | Any other OAuthException: user denied access, Adobe rejected the code |
| callback | 502 | TransportException: Acrobat Sign unreachable |
| callback | 401 | No signed-in user |
| webhook | 200 | Accepted, with X-AdobeSign-ClientId header and {"xAdobeSignClientId": "…"} body |
| webhook | 403 | Missing or unknown client id |
| webhook | 400 | POST body unreadable |
The adobe-sign:verify command
adobe-sign:verify {--user= : Check this user's OAuth connection instead of the default client}
Calls GET /users/me with the default client, or with
forUser($user) when --user is given (a token key, e.g. 42 or
team:7). On success it prints "Connected to Acrobat Sign." with the user's email, whether
they are an account admin, and the account id, and exits 0. On any SDK exception, including
MisconfiguredException, it prints the message and exits 1.
php artisan adobe-sign:verify
php artisan adobe-sign:verify --user=42
Publishable files
| Tag | Publishes | Command |
|---|---|---|
adobe-sign-config | config/adobe-sign.php | php artisan vendor:publish --tag=adobe-sign-config |
adobe-sign-migrations | The token table migration, into database/migrations | php artisan vendor:publish --tag=adobe-sign-migrations |
Every config key is described on the Configuration page.
AdobeSignToken model
Conceptlz\AdobeSign\Laravel\Models\AdobeSignToken extends Illuminate\Database\Eloquent\Model.
| Aspect | Value |
|---|---|
| Table | getTable() returns config('adobe-sign.oauth.table', 'adobe_sign_tokens') |
| Casts | access_token and refresh_token: encrypted; expires_at: datetime |
| Hidden | access_token, refresh_token |
| Guarded | nothing ($guarded = []) |
| Properties | string $key, string $access_token, ?string $refresh_token, ?Carbon $expires_at, ?string $api_access_point |
Useful for admin screens and housekeeping, e.g. listing connections that will lapse:
use Conceptlz\AdobeSign\Laravel\Models\AdobeSignToken;
$stale = AdobeSignToken::where('updated_at', '<', now()->subDays(50))->pluck('key');
EloquentTokenStore
get(string $key): ?Conceptlz\AdobeSign\Auth\AccessToken
The stored token for a key, or null.
put(string $key, Conceptlz\AdobeSign\Auth\AccessToken $token): void
Insert or update the row for the key (updateOrCreate).
forget(string $key): void
Delete the row. Not part of the TokenStore interface, and it doesn't revoke the token at Adobe; call AdobeSign::oauth()->revoke($token) first if that matters.
Migration columns
Table name from adobe-sign.oauth.table (default adobe_sign_tokens):
| Column | Definition |
|---|---|
id | $table->id() |
key | string, unique |
access_token | text (encrypted) |
refresh_token | text, nullable (encrypted) |
expires_at | timestamp, nullable |
api_access_point | string, nullable |
created_at, updated_at | $table->timestamps() |
MisconfiguredException
Conceptlz\AdobeSign\Laravel\MisconfiguredException extends RuntimeException and
implements the core's Conceptlz\AdobeSign\Exception\AdobeSignException, so a
catch (AdobeSignException $e) covers it too. These are the messages it carries:
| Message | Thrown by | Fix |
|---|---|---|
Set ADOBE_SIGN_INTEGRATION_KEY, or ADOBE_SIGN_AUTH=oauth. | client() | Add the key |
adobe-sign.auth is "oauth" but no user is signed in; use AdobeSign::forUser($user). | client() | Use forUser() in jobs, commands and listeners |
Set ADOBE_SIGN_CLIENT_ID and ADOBE_SIGN_CLIENT_SECRET to use OAuth. | oauth(), forUser(), the OAuth routes | Add the OAuth app credentials |
Set ADOBE_SIGN_WEBHOOK_CLIENT_IDS (or ADOBE_SIGN_CLIENT_ID) to receive webhooks. | webhookHandler(), the webhook route | Add the allow-list |
ADOBE_SIGN_SIGNATURE_LEVEL must be ses, aes or qes; got "…". | signatureLevel(), and so every client creation | Fix the value |
All other exceptions come from the core; see its errors page.
Common questions
Will my IDE autocomplete AdobeSign::agreements()?
Yes. The facade's docblock declares every method with its return type, so PhpStorm, Intelephense and PHPStan/Larastan resolve AdobeSign::agreements()->create() to the core Agreements resource.
Does the package fire events for individual signers or statuses?
It fires one event type for all webhooks, WebhookReceived, and leaves interpretation to you. Check $received->event->event or use is(EventType::…) and isWorkflowCompleted(). The only other event is OAuthConnected.
Can I extend AdobeSignManager?
It isn't final, so you can subclass it and rebind it as scoped in your own service provider. Prefer composition where you can: most needs are covered by binding a ClientInterface or TokenStore, or by building a core client directly.
Can I rename the package's routes?
The names (adobe-sign.oauth.redirect, adobe-sign.oauth.callback, adobe-sign.webhook) are fixed; the URIs and middleware are configurable. The manager relies on the callback's name to build the default redirect URI.