DI a akcie
Fasáda je odporúčaná predvolená cesta, nie jediná. Každá operácia je akcia, manažér sprístupňuje každú z nich a fasáda je nadstavba nad manažérom — všetky tri spúšťajú rovnaký kód. Manažér je RoundlyConsulting\Imports\ImportsManager, koreň fasády, zaregistrovaný v kontajneri ako singleton:
use RoundlyConsulting\Imports\Actions\Sessions\UploadImportAction;
use RoundlyConsulting\Imports\DataTransferObjects\{ImportSource, UploadData};
use RoundlyConsulting\Imports\Facades\Imports;
use RoundlyConsulting\Imports\ImportsManager;
// 1. Facade
$session = Imports::for($team)->by($user)->upload('assets', $request->file('file'));
// 2. Dependency injection — the same object the facade resolves (a container singleton)
public function __construct(private ImportsManager $imports) {}
$session = $this->imports->for($team)->by($user)->upload('assets', $request->file('file'));
// 3. The raw action — returns the model, not a handle
$model = app(UploadImportAction::class)->execute(
new UploadData('assets', $team, $user, ImportSource::upload($request->file('file'))),
);
$session = Imports::session($model); // wrap it in a handle (trusted path)Injektujte manažér
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use RoundlyConsulting\Imports\ImportsManager;
final class AssetImportController
{
public function __construct(private ImportsManager $imports) {}
public function store(Request $request): JsonResponse
{
$session = $this->imports->for($request->user()->currentTeam)->by($request->user())
->upload('assets', $request->file('file'))
->preview();
return response()->json($session->counts()->toArray());
}
}Manažér zámerne nie je final — fake ho rozširuje, takže kód, ktorý injektuje ImportsManager, pod Imports::fake() stále prejde typovou kontrolou a je tiež nahrádzaný fakom.
Zavolajte akciu
Akcie sú triedy final readonly s jednou metódou execute(). Vytvárajte ich cez kontajner. Prijímajú a vracajú modely, nie handle — ak handle potrebujete, model zabaľte cez Imports::session($model) alebo Imports::batch($model):
use RoundlyConsulting\Imports\Actions\Commit\CommitImportAction;
use RoundlyConsulting\Imports\Actions\Mapping\SaveMappingAction;
use RoundlyConsulting\Imports\Actions\Templates\BuildTemplateAction;
use RoundlyConsulting\Imports\DataTransferObjects\SaveMappingData;
use RoundlyConsulting\Imports\Enums\TemplateFormat;
$template = app(BuildTemplateAction::class)->execute('assets', TemplateFormat::Csv, 'sk');
$batch = app(CommitImportAction::class)->execute($sessionModel, $user); // an ImportBatch model
app(SaveMappingAction::class)->execute(
SaveMappingData::fromColumns($team, 'assets', 'ERP', ['Inventárne č.' => 'asset_tag'], $user),
);Metóda fasády → akcia
Menné priestory sú relatívne k RoundlyConsulting\Imports\Actions:
| Akcia | execute(…) | Vracia | Cesta cez fasádu |
|---|---|---|---|
Templates\BuildTemplateAction | (string $importer, TemplateFormat $format, ?string $locale = null) | Template | template() · importer()->template() |
Sessions\UploadImportAction | (UploadData $data) | ImportSession | for()->upload() |
Sessions\UploadFilesAction | (UploadFilesData $data) | ImportSession | for()->uploadFiles() |
Sessions\ConfigureSourceAction | (ImportSession $session, ?Model $actor, $sheet = null, ?string $delimiter = null, ?int $headerRow = null) | ImportSession | useSheet() · useDelimiter() · useHeaderRow() |
Sessions\DiscardImportAction | (ImportSession $session, ?Model $actor) | ImportSession | discard() |
Mapping\SuggestMappingAction | (ImportSession $session, ?Model $actor) | MappingSuggestion | suggestMapping() |
Mapping\ApplyMappingAction | (ImportSession $session, array|ColumnMapping $mapping, ?Model $actor) | ImportSession | map() |
Mapping\SaveMappingAction | (SaveMappingData $data) | SavedMapping | saveMapping() · mappings()->save() |
Mapping\DeleteSavedMappingAction | (Model $owner, string $importer, string $name, ?Model $actor) | bool | mappings()->delete() |
Preview\PreviewImportAction | (ImportSession $session, ?Model $actor, ?bool $queue = null) | ImportSession | preview() |
Preview\ChooseModeAction | (ImportSession $session, DuplicateMode $mode, ?Model $actor) | ImportSession | mode() |
Preview\BuildErrorReportAction | (ImportSession $session, TemplateFormat $format, ?Model $actor) | Template | errorReport() |
Commit\CommitImportAction | (ImportSession $session, ?Model $actor) | ImportBatch | commit() |
Commit\CancelImportAction | (ImportBatch $batch, ?Model $actor) | ImportBatch | cancel() |
Commit\ResumeImportAction | (ImportBatch $batch, ?Model $actor) | ImportBatch | resume() |
Rollback\RollbackImportAction | (ImportBatch $batch, ?Model $actor) | ImportBatch | rollback() |
Maintenance\PruneImportsAction · SweepImportsAction | () | PruneReport · SweepReport | prune() · sweep() |
- Fasáda aj manažér vytvárajú každú akciu cez kontajner, takže väzba vlastnej podtriedy akcie platí vo všetkých troch štýloch.
- Imports::fake() zaznamenáva volania cez fasádu, manažér, každý handle aj pomocníkov na modeloch ($session->handle(), $batch->handle()).
- Interné stavebné bloky — ValidateRowsAction, ClassifyRowsAction, PreviewFilesAction, ProcessChunkAction, FinishImportAction, FailImportAction, RollbackChunkAction a FinishRollbackAction, ktoré spúšťajú úlohy a sweep — nie sú určené pre kód aplikácie.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.