Vai al contenuto principale
Questo articolo si basa su un’analisi del codice sorgente. Si tratta di un pacchetto in una fase iniziale di sviluppo che ha appena ricevuto il tag v0.1 (dato di maggio 2026).

Cos’è Laravel Chisel

Laravel Chisel è un pacchetto che fornisce le primitive per costruire script post-installazione che rimuovono le funzionalità non necessarie dagli starter kit di Laravel. Gli starter kit includono di default molte funzionalità, ma a seconda del progetto alcune possono essere superflue. Chisel risolve questo problema offrendo un meccanismo che, in modo interattivo dopo l’installazione, “mantiene solo le funzionalità necessarie”.

Perché serve

Gli starter kit di Laravel raccolgono molte funzionalità, ma non tutte servono in ogni progetto. Ad esempio:
  • Progetti che non hanno bisogno della verifica via email
  • Progetti che non usano l’autenticazione con passkey
  • Configurazioni che non richiedono determinati componenti Livewire
Finora bisognava rimuovere manualmente le funzionalità superflue, ma con Chisel la personalizzazione si conclude tramite prompt interattivi al momento dell’installazione.

Definizione dello script chisel.php

Uno starter kit che usa Chisel posiziona il file chisel.php nella radice del progetto. Questo file definisce “quali funzionalità sono opzionali”.
<?php

require getenv('LARAVEL_INSTALLER_AUTOLOADER');

use Laravel\Chisel\Chisel;
use Laravel\Chisel\Question;

return Chisel::script(dirname(__DIR__))
    ->questions([
        Question::multiselect(
            name: 'auth_features',
            label: 'Which authentication features would you like to enable?',
            options: [
                'email-verification' => 'Email verification',
            ],
            hint: 'Use space to select, enter to confirm.',
        ),
    ])
    ->selected('auth_features', 'email-verification',
        then: function (Chisel $c) {
            // Se selezionato: rimuovi i marker di sezione e mantieni il codice
            $c->files(
                'resources/js/pages/settings/profile.tsx',
                'app/Providers/FortifyServiceProvider.php',
            )->removeSectionMarkers('email-verification');
        },
        else: function (Chisel $c) {
            // Se non selezionato: cancella file e funzionalità correlate
            $c->php('app/Models/User.php')
                ->removeImport('Illuminate\Contracts\Auth\MustVerifyEmail')
                ->removeInterface('MustVerifyEmail');

            $c->file('config/fortify.php')->removeLinesContaining('Features::emailVerification()');

            $c->files(
                'app/Providers/FortifyServiceProvider.php',
                'resources/js/pages/settings/profile.tsx',
            )->removeSection('email-verification');

            $c->files(
                'resources/js/components/email-verification-notice.tsx',
                'resources/js/pages/auth/verify-email.tsx',
                'tests/Feature/Auth/EmailVerificationTest.php',
                'tests/Feature/Auth/VerificationNotificationTest.php',
            )->delete();
        },
    );

Metodi di definizione dello script

MetodoDescrizione
Chisel::script($directory)Crea la definizione dello script
Question::multiselect(...)Definisce una domanda a scelta multipla
questions([...])Imposta le domande dello script
questions()Recupera le domande registrate
collectAnswers()Avvia la raccolta delle risposte alle domande
apply($callback)Registra uno step di mutazione incondizionato
selected($key, $value, then:, else:)Diramazione con un singolo valore selezionato
selectedAny($key, $values, then:, else:)Diramazione se è selezionato uno qualsiasi dei valori
selectedAll($key, $values, then:, else:)Diramazione se sono selezionati tutti i valori
chisel($answers)Esegue le mutazioni registrate

Raccolta interattiva delle risposte

collectAnswers() restituisce un raccoglitore di risposte. Tutti i metodi sono fluent e possono essere chiamati in qualsiasi ordine. In ambienti non interattivi vengono usati automaticamente i valori predefiniti. Un comando Artisan esterno mostra i prompt usando Laravel Prompts e passa le risposte a Chisel.
use Illuminate\Console\Command;
use Laravel\Chisel\Chisel;
use Laravel\Chisel\Question;
use RuntimeException;

use function Laravel\Prompts\multiselect;

class InstallFeatures extends Command
{
    protected $signature = 'install:features
        {--answers= : JSON string of answers to skip interactive prompts}';

    public function handle(): void
    {
        $script = require base_path('chisel.php');

        $providedAnswers = $this->option('answers') === null
            ? []
            : json_decode((string) $this->option('answers'), true, 512, JSON_THROW_ON_ERROR);

        $answers = $script
            ->collectAnswers()
            ->onQuestion(fn (Question $question) => match ($question->type) {
                'multiselect' => multiselect(
                    label: $question->label,
                    options: $question->options,
                    default: $question->default ?? [],
                    required: $question->required,
                    hint: $question->hint,
                ),
                default => throw new RuntimeException("Unsupported question type [{$question->type}]."),
            })
            ->interactive($this->input->isInteractive())
            ->withAnswers($providedAnswers);

        $script->chisel($answers);

        $chisel = Chisel::in(base_path());

        $chisel->npm()->install();
        $chisel->npm()->run('build');
    }
}
MetodoDescrizione
onQuestion($callback)Imposta l’handler per il prompt della domanda
interactive($interactive)Imposta la modalità interattiva
withAnswers($answers)Fornisce risposte già raccolte per saltare i prompt

Mutazione dei file

Con file($path) si opera su un singolo file, con files(...$paths) su più file.
MetodoDescrizione
replace($search, $replace)Sostituisce una stringa
removeLinesContaining($content)Rimuove le righe contenenti la stringa indicata
removeSectionMarkers($tag)Rimuove i marker di sezione mantenendo il contenuto
removeSection($tag)Rimuove i marker di sezione e il contenuto al loro interno
delete()Cancella il file di destinazione

Editing basato su AST PHP

php($path) fornisce editing tramite l’AST di PHP. Le modifiche vengono salvate automaticamente quando l’oggetto viene distrutto. Per le basi dell’AST di PHP (Abstract Syntax Tree) e l’uso di nikic/php-parser, consulta questa pagina.
MetodoDescrizione
removeImport($class)Elimina un’istruzione use
removeTrait($trait)Rimuove l’uso di un trait dalla classe
removeInterface($interface)Rimuove un’interfaccia implementata

Section Markers

Racchiude codice opzionale tra coppie di commenti.
/* @chisel-passkeys */
Fortify::authenticateUsingPasskeys();
/* @end-chisel-passkeys */
Nei file JSX si usano i commenti a blocco tra parentesi graffe ({}).
{
    /* @chisel-passkeys */
}
<PasskeyButton />;
{
    /* @end-chisel-passkeys */
}
  • removeSectionMarkers('passkeys') — rimuove i marker e lascia il codice
  • removeSection('passkeys') — cancella sia i marker sia il codice
Il prefisso chisel- viene aggiunto automaticamente.

Supporto npm

MetodoDescrizione
npm()->install()Installa le dipendenze con il package manager rilevato
npm()->run($script, ...$arguments)Esegue uno script del package manager
npm()->remove(...$packages)Rimuove pacchetti con il package manager rilevato
Il metodo npm() rileva automaticamente npm, yarn, pnpm e bun.

Stato attuale dello sviluppo

  • Repository GitHub: laravel/chisel
  • Rilascio: v0.1 (pubblicato a maggio 2026)
  • Sviluppo: pubblicato dopo 3 mesi di sviluppo non pubblico
Chisel non è un pacchetto che gli utenti finali installano direttamente nelle app Laravel, ma una libreria usata internamente dagli starter kit. In futuro ci si aspetta che gli starter kit ufficiali di Laravel forniscano script post-installazione che sfruttano Chisel.

Repository laravel/chisel

Codice sorgente e riferimento API più recente.

Documentazione ufficiale degli starter kit Laravel

Per l’uso degli starter kit consulta la documentazione ufficiale.
Ultima modifica il 13 luglio 2026