1. Go to this page and download the library: Download timatic/php-sdk library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
timatic / php-sdk example snippets
use Timatic\Requests\Budget\GetBudgetsCollectionRequest;
use Timatic\Requests\Budget\GetBudgetRequest;
use Timatic\Requests\Budget\PostBudgetsRequest;
use Timatic\Requests\BudgetType\GetBudgetTypesCollectionRequest;
use Timatic\TimaticConnector;
class BudgetController extends Controller
{
public function __construct(
protected TimaticConnector $timatic
) {}
public function index()
{
// fetch one or more items, limited by the default page size from the api
$budgetTypes = $this->timatic
->send(new GetBudgetTypesCollectionRequest())
->dto();
$defaultBudget = $this->timatic->send(
new \Timatic\Requests\Budget\GetBudgetRequest(id: '1337')
)->dtoOrFail();
// fetch all DTO's
$budgets = $this->timatic->paginate(new GetBudgetsCollectionRequest())
->dtoCollection();
return view('budgets.index', compact('budgets', 'budgetTypes', 'defaultBudget'));
}
public function store(Request $request)
{
$budget = new \Timatic\Dto\Budget([
'title' => $request->input('title'),
'totalPrice' => $request->input('total_price'),
]);
$created = $this->timatic
->send(new PostBudgetsRequest($budget))
->dtoOrFail();
return redirect()->route('budgets.show', $created->id);
}
}
use \Timatic\Requests\Budget\GetBudgetsCollectionRequest;
use Timatic\TimaticConnector;
class SyncBudgetsCommand extends Command
{
public function handle(TimaticConnector $timatic): int
{
$budgets = $timatic->paginate(
new GetBudgetsCollectionRequest()
)->dtoCollection()
foreach ($budgets as $budget) {
// Process budgets
}
return Command::SUCCESS;
}
}
use Timatic\TimaticConnector;
use Timatic\Dto\Budget;
use Timatic\Dto\BudgetType;
use Timatic\Requests\Budget\GetBudgetsRequest;
use Timatic\Requests\Budget\PostBudgetsRequest;
use Timatic\Requests\BudgetType\GetBudgetTypesRequest;
use Saloon\Http\Faking\MockClient;
use Saloon\Http\Faking\MockResponse;
test('it displays budgets and budget types', function () {
// Generate test data using factories
$budget = Budget::factory()->state(['id' => '1'])->make();
$budgetType = BudgetType::factory()->state(['id' => '1'])->make();
// Create mock responses using factory-generated data
$mockClient = MockClient::global([
GetBudgetsRequest::class => MockResponse::make([
'data' => [$budget->toJsonApi()],
], 200),
GetBudgetTypesRequest::class => MockResponse::make([
'data' => [$budgetType->toJsonApi()],
], 200),
]);
// Make request
$response = $this->get(route('budgets.index'));
// Assert
$response->assertOk();
$response->assertViewHas('budgets');
$response->assertViewHas('budgetTypes');
});
test('it creates a new budget', function () {
// Generate test data with specific attributes
$budget = Budget::factory()->state([
'id' => '2',
'title' => 'New Budget',
'totalPrice' => '5000.00',
])->make();
$mockClient = MockClient::global([
PostBudgetsRequest::class => MockResponse::make([
'data' => $budget->toJsonApi(),
], 201),
]);
$response = $this->post(route('budgets.store'), [
'title' => 'New Budget',
'total_price' => 5000.00,
]);
$response->assertRedirect(route('budgets.show', '2'));
});
test('it sends a POST request to create a budget using the SDK', function () {
$budgetToCreate = Budget::factory()->state([
'title' => 'New Budget',
'totalPrice' => '5000.00',
'customerId' => 'customer-123',
])->make();
$createdBudget = Budget::factory()->state([
'id' => 'created-456',
'title' => 'New Budget',
'totalPrice' => '5000.00',
'customerId' => 'customer-123',
])->make();
$mockClient = MockClient::global([
PostBudgetsRequest::class => MockResponse::make([
'data' => $createdBudget->toJsonApi(),
], 201),
]);
artisan('sync:budgets')->assertOk();
// Assert the request body was sent correctly
$mockClient->assertSent(function (PostBudgetsRequest $request) {
$body = $request->body()->all();
return $body['data']['attributes']['title'] === 'New Budget'
&& $body['data']['attributes']['totalPrice'] === '5000.00'
&& $body['data']['attributes']['customerId'] === 'customer-123';
});
});
// Create a single model with random data, without an ID
$budget = Budget::factory()->make();
// Create multiple models with unique UUID IDs
$budgets = Budget::factory()->withId()->count(3)->make(); // Returns Collection
// Override specific attributes
$budget = Budget::factory()->state([
'title' => 'Q1 Budget',
'totalPrice' => '10000.00',
])->make();
// Chain state calls for complex scenarios
$budget = Budget::factory()
->state(['customerId' => $customerId])
->state(['budgetTypeId' => $budgetTypeId])
->make();
use Timatic\TimaticConnector;
use Timatic\Requests\Budget\GetBudgets;
class BudgetController extends Controller
{
public function index(TimaticConnector $timatic)
{
// Create a paginator
$paginator = $timatic->paginate(new GetBudgets());
// Optionally set items per page (default is API's default)
$paginator->setPerPageLimit(50);
// Iterate through all pages automatically
foreach ($paginator->items() as $budget) {
// Process each budget across all pages
// The paginator handles pagination automatically
}
// Or collect all items at once
$allBudgets = $paginator->dtoCollection();
}
}
$response = $timatic->send(new GetBudgetsCollectionRequest());
// Get the first item from a collection
$firstBudget = $response->firstItem();
// Check for errors
if ($response->hasErrors()) {
$errors = $response->errors();
// Handle errors...
}
// Access JSON:API meta information
$meta = $response->meta();
$total = $meta['total'] ?? 0;
// Access pagination links
$links = $response->links();
$nextPage = $links['next'] ?? null;
// Access