1. Go to this page and download the library: Download shaelz/stage-gate 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/ */
shaelz / stage-gate example snippets
use StageGate\{Field, FieldGroup, Schema, Proof, Stage, Classifier, Approve, Publish};
// 1. Define what a valid row looks like, and which fields make a change risky.
$schema = new Schema('sku', [
new Field('sku'),
new Field('price', validate: fn ($v) => is_numeric($v)),
]);
$fieldGroups = [
new FieldGroup('metadata', ['name', 'category']),
new FieldGroup('price', ['price'], isRisk: true),
];
// 2. Proof: validate raw rows against the schema.
$proof = Proof::analyze($rawRows, $schema);
if (! $proof->isValid()) {
// handle $proof->errors and stop here
}
// 3. Stage: hold the valid rows as a pending batch.
$batch = Stage::stage('import-2026-07-03', $proof->rows);
// 4. Review: classify staged rows against what your app already has.
$existingRows = /* your own query, e.g. WHERE category IN (...) */ [];
$classified = Classifier::classifyAll($batch->rows, $existingRows, $fieldGroups);
// 5. Approve: acknowledge overwrite-risk rows explicitly (or none, to block them).
$approval = Approve::approve($batch, $classified, approvedRowKeys: [], approvedBy: '[email protected]');
// 6. Publish: get a plan back, then execute it yourself, inside your own transaction.
$plan = Publish::plan($classified, $approval, source: 'products-2026-07.csv');
DB::transaction(function () use ($plan) {
foreach ($plan->writes as $write) {
// $write->changeClass tells you upsert vs. delete (ChangeClass::Removed)
MyModel::query()->updateOrCreate(['sku' => $write->row->key], $write->row->data);
}
AuditLog::create([
'source' => $plan->audit->source,
'approved_by' => $plan->audit->approvedBy,
'change_counts' => $plan->audit->changeCounts,
]);
});
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.