NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky

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:

Akciaexecute(…)VraciaCesta cez fasádu
Templates\BuildTemplateAction(string $importer, TemplateFormat $format, ?string $locale = null)Templatetemplate() · importer()->template()
Sessions\UploadImportAction(UploadData $data)ImportSessionfor()->upload()
Sessions\UploadFilesAction(UploadFilesData $data)ImportSessionfor()->uploadFiles()
Sessions\ConfigureSourceAction(ImportSession $session, ?Model $actor, $sheet = null, ?string $delimiter = null, ?int $headerRow = null)ImportSessionuseSheet() · useDelimiter() · useHeaderRow()
Sessions\DiscardImportAction(ImportSession $session, ?Model $actor)ImportSessiondiscard()
Mapping\SuggestMappingAction(ImportSession $session, ?Model $actor)MappingSuggestionsuggestMapping()
Mapping\ApplyMappingAction(ImportSession $session, array|ColumnMapping $mapping, ?Model $actor)ImportSessionmap()
Mapping\SaveMappingAction(SaveMappingData $data)SavedMappingsaveMapping() · mappings()->save()
Mapping\DeleteSavedMappingAction(Model $owner, string $importer, string $name, ?Model $actor)boolmappings()->delete()
Preview\PreviewImportAction(ImportSession $session, ?Model $actor, ?bool $queue = null)ImportSessionpreview()
Preview\ChooseModeAction(ImportSession $session, DuplicateMode $mode, ?Model $actor)ImportSessionmode()
Preview\BuildErrorReportAction(ImportSession $session, TemplateFormat $format, ?Model $actor)TemplateerrorReport()
Commit\CommitImportAction(ImportSession $session, ?Model $actor)ImportBatchcommit()
Commit\CancelImportAction(ImportBatch $batch, ?Model $actor)ImportBatchcancel()
Commit\ResumeImportAction(ImportBatch $batch, ?Model $actor)ImportBatchresume()
Rollback\RollbackImportAction(ImportBatch $batch, ?Model $actor)ImportBatchrollback()
Maintenance\PruneImportsAction · SweepImportsAction()PruneReport · SweepReportprune() · 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 kryptomien

Odoslaní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.