Generación de archivos
Introducción
Filament incluye muchos comandos CLI que generan archivos. Esta guía es para explicar cómo puede personalizar los archivos generados.
La gran mayoría de archivos que genera Filament son clases PHP. Filament usa nette/php-generator para generar clases mediante programación, en lugar de usar archivos de plantilla. La ventaja de esto es que hay mucha más flexibilidad en los archivos generados, lo cual es importante cuando necesitas admitir tantas opciones de configuración diferentes como las que tiene Filament.
Cada tipo de clase es generado por una clase ClassGenerator. Aquí hay una lista de ClassGenerator clases que utiliza Filament:
Filament\Actions\Commands\FileGenerators\ExporterClassGeneratores utilizado por el comandomake:filament-exporter.Filament\Actions\Commands\FileGenerators\ImporterClassGeneratores utilizado por el comandomake:filament-importer.Filament\Forms\Commands\FileGenerators\FieldClassGeneratores utilizado por el comandomake:filament-form-field.Filament\Forms\Commands\FileGenerators\FormSchemaClassGeneratores utilizado por el comandomake:filament-form.Filament\Forms\Commands\FileGenerators\LivewireFormComponentClassGeneratores utilizado por el comandomake:filament-livewire-form.Filament\Infolists\Commands\FileGenerators\EntryClassGeneratores utilizado por el comandomake:filament-infolist-entry.Filament\Commands\FileGenerators\Resources\Pages\ResourceCreateRecordPageClassGeneratores utilizado por los comandosmake:filament-resourcey make:filament-page.Filament\Commands\FileGenerators\Resources\Pages\ResourceCustomPageClassGeneratores utilizado por los comandosmake:filament-resourcey make:filament-page.Filament\Commands\FileGenerators\Resources\Pages\ResourceEditRecordPageClassGeneratores utilizado por los comandosmake:filament-resourcey make:filament-page.Filament\Commands\FileGenerators\Resources\Pages\ResourceListRecordsPageClassGeneratores utilizado por los comandosmake:filament-resourcey make:filament-page.Filament\Commands\FileGenerators\Resources\Pages\ResourceManageRecordsPageClassGeneratores utilizado por los comandosmake:filament-resourcey make:filament-page.Filament\Commands\FileGenerators\Resources\Pages\ResourceManageRelatedRecordsPageClassGeneratores utilizado por los comandosmake:filament-resourcey make:filament-page.Filament\Commands\FileGenerators\Resources\Pages\ResourceViewRecordPageClassGeneratores utilizado por los comandosmake:filament-resourcey make:filament-page.Filament\Commands\FileGenerators\Resources\SchemasResourceFormSchemaClassGeneratores utilizado por el comandomake:filament-resource.Filament\Commands\FileGenerators\Resources\SchemasResourceInfolistSchemaClassGeneratores utilizado por el comandomake:filament-resource.Filament\Commands\FileGenerators\Resources\SchemasResourceTableClassGeneratores utilizado por el comandomake:filament-resource.Filament\Commands\FileGenerators\Resources\RelationManagerClassGeneratores utilizado por el comandomake:filament-relation-manager.Filament\Commands\FileGenerators\Resources\ResourceClassGeneratores utilizado por el comandomake:filament-resource.Filament\Commands\FileGenerators\ClusterClassGeneratores utilizado por el comandomake:filament-cluster.Filament\Commands\FileGenerators\CustomPageClassGeneratores utilizado por el comandomake:filament-page.Filament\Commands\FileGenerators\PanelProviderClassGeneratores utilizado por los comandosfilament:instally make:filament-panel.Filament\Schemas\Commands\FileGenerators\ComponentClassGeneratores utilizado por el comandomake:filament-schema-component.Filament\Schemas\Commands\FileGenerators\LivewireSchemaComponentClassGeneratores utilizado por el comandomake:filament-livewire-schema.Filament\Schemas\Commands\FileGenerators\SchemaClassGeneratores utilizado por el comandomake:filament-schema.Filament\Tables\Commands\FileGenerators\ColumnClassGeneratores utilizado por el comandomake:filament-table-column.Filament\Tables\Commands\FileGenerators\LivewireTableComponentClassGeneratores utilizado por el comandomake:filament-livewire-table.Filament\Tables\Commands\FileGenerators\TableClassGeneratores utilizado por el comandomake:filament-table.Filament\Widgets\Commands\FileGenerators\ChartWidgetClassGeneratores utilizado por el comandomake:filament-widget.Filament\Widgets\Commands\FileGenerators\CustomWidgetClassGeneratores utilizado por el comandomake:filament-widget.Filament\Widgets\Commands\FileGenerators\StatsOverviewWidgetClassGeneratores utilizado por el comandomake:filament-widget.Filament\Widgets\Commands\FileGenerators\TableWidgetClassGeneratores utilizado por el comandomake:filament-widget.
La anatomía de un generador de clases.
La mejor manera de aprender sobre los generadores de clases es mirar su código fuente. Todos siguen patrones muy similares y utilizan las funciones de nette/php-generator.
Aquí hay algunos métodos a tener en cuenta:
__construct()acepta los parámetros que se pasan al generador. Esta es toda la información a la que tiene acceso como contexto para generar la clase.getImports()devuelve las importaciones que se utilizan en la clase que se genera. Esta no es una lista exclusiva y también se pueden agregar importaciones mientras se generan propiedades y métodos, si eso es más fácil que proporcionarlos por adelantado.getExtends()devuelve el nombre completo de la clase que se está ampliando.addTraitsToClass()se utiliza para agregar rasgos a la clase que se está generando. El objetoClassdenette/php-generatorse pasa como parámetro.addPropertiesToClass()se utiliza para agregar propiedades a la clase que se está generando. El objetoClassdenette/php-generatorse pasa como parámetro.- Los métodos
add*PropertyToClass()se utilizan para agregar una sola propiedad a la clase que se está generando. El objetoClassdenette/php-generatorse pasa como parámetro. Suelen llamarse desdeaddPropertiesToClass(). addMethodsToClass()se utiliza para agregar métodos a la clase que se está generando. El objetoClassdenette/php-generatorse pasa como parámetro.- Los métodos
add*MethodToClass()se utilizan para agregar un solo método a la clase que se está generando. El objetoClassdenette/php-generatorse pasa como parámetro. Suelen llamarse desdeaddMethodsToClass().
Reemplazo de un generador de clases
Para poder realizar cambios en la forma en que se genera un archivo, debe identificar el generador de clases correcto (consulte la lista anterior) y reemplazarlo.
Para reemplazarlo, cree una nueva clase que extienda el generador de clases que desea reemplazar. Por ejemplo, si desea reemplazar ResourceClassGenerator, cree una nueva clase como esta:
namespace App\Filament\Commands\FileGenerators\Resources;
use Filament\Commands\FileGenerators\Resources\ResourceClassGenerator as BaseResourceClassGenerator;
class ResourceClassGenerator extends BaseResourceClassGenerator
{
// ...
}
También debe registrarlo como enlace en el contenedor de servicios. Puedes hacer esto en un proveedor de servicios como AppServiceProvider:
use App\Filament\Commands\FileGenerators\Resources\ResourceClassGenerator;
use Filament\Commands\FileGenerators\Resources\ResourceClassGenerator as BaseResourceClassGenerator;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
// ...
$this->app->bind(BaseResourceClassGenerator::class, ResourceClassGenerator::class);
// ...
}
}
Personalizar una propiedad o método existente en una clase
Mientras visualiza el código fuente del generador de clases, ubique la propiedad o método que desea personalizar. Puedes anularlo en tu generador de clases simplemente definiendo un nuevo método con el mismo nombre. Por ejemplo, aquí hay un método que puede encontrar para agregar la propiedad $navigationIcon a una clase de recurso:
use BackedEnum;
use Filament\Support\Icons\Heroicon;
use Nette\PhpGenerator\ClassType;
use Nette\PhpGenerator\Literal;
protected function addNavigationIconPropertyToClass(ClassType $class): void
{
$this->namespace->addUse(BackedEnum::class);
$this->namespace->addUse(Heroicon::class);
$property = $class->addProperty('navigationIcon', new Literal('Heroicon::OutlinedRectangleStack'))
->setProtected()
->setStatic()
->setType('string|BackedEnum|null');
$this->configureNavigationIconProperty($property);
}
Puede anular ese método para cambiar su comportamiento, o simplemente puede anular el método configureNavigationIconProperty() para entender cómo está configurada la propiedad. Por ejemplo, haga la propiedad public en lugar de protected:
use Nette\PhpGenerator\Property;
protected function configureNavigationIconProperty(Property $property): void
{
$property->setPublic();
}
Agregar una nueva propiedad o método a una clase
Para agregar una nueva propiedad o método a una clase, puede hacerlo en los métodos addPropertiesToClass() o addMethodsToClass(). Para heredar las propiedades existentes en lugar de reemplazarlas, asegúrese de llamar a parent::addPropertiesToClass() o parent::addMethodsToClass() al comienzo de su método. Por ejemplo, aquí se explica cómo agregar una nueva propiedad a una clase de recurso:
use Nette\PhpGenerator\ClassType;
use Nette\PhpGenerator\Literal;
protected function addPropertiesToClass(ClassType $class): void
{
parent::addPropertiesToClass($class);
$class->addProperty('navigationSort', 10)
->setProtected()
->setStatic()
->setType('?int');
}