Skip to content

Customizing Printers ​

Printers are responsible for generating specific parts of code within templates, such as fillable arrays, casts, validation rules, and migrations. By customizing printers, you can modify how these code segments are generated without changing the entire generator.

Understanding Printers ​

CRUD Templates for Laravel includes these built-in printers:

  • casts - Model type casts
  • factory - Factory field definitions
  • fillable - Fillable array for models
  • migrations - Migration column definitions
  • relations - Relationship methods for models
  • resource - Resource fields and relationships
  • rules - Validation rules
  • dbAssertions - Database assertion columns for tests

How Printers Work ​

Printers are used by generators to produce specific code segments. They receive a Payload object containing model and field information, and return an Output object with the generated code.

Creating a Custom Printer ​

Quick Start: Using the Make Command ​

The fastest way to create a new printer is using the make:printer command:

bash
php artisan make:printer CustomFillable

This command will:

  1. Create a printer class at app/Printers/{Name}Printer.php
  2. Automatically register it in app/Providers/CrudTemplatesServiceProvider.php

TIP

Use --force to overwrite an existing printer file.

If you want to understand what the command generated or customize it further, continue reading the manual creation steps below.

Step 1: Create the Printer Class ​

Create a class that implements the Printer interface:

php
<?php

namespace App\Printers;

use JCSoriano\CrudTemplates\Printers\Printer;
use JCSoriano\CrudTemplates\DataObjects\Output;
use JCSoriano\CrudTemplates\DataObjects\Payload;

class CustomFillablePrinter implements Printer
{
    public function print(Payload $payload): Output
    {
        $fields = $payload->fields;
        $fillableFields = collect();
        
        foreach ($fields as $field) {
            $fieldType = new $field->typeClass($field);
            
            if (method_exists($fieldType, 'fillable')) {
                $result = $fieldType->fillable();
                if ($result) {
                    $fillableFields->push("'{$result->output}'");
                }
            }
        }
        
        return new Output($fillableFields->join(",\n        "));
    }
}

Step 2: Register the Printer ​

Register your printer in a service provider's register() method:

php
use App\Printers\CustomFillablePrinter;

public function register()
{
    $this->app->bind('crud-templates::printer::fillable', CustomFillablePrinter::class);
}

Note: To override an existing printer, bind to the same key as the package default (e.g., crud-templates::printer::fillable).

Step 3: The Printer is Used Automatically ​

Once registered, your custom printer will be used automatically by the model generator when it needs to generate fillable fields.

The Printer Interface ​

All printers must implement the Printer interface:

php
interface Printer
{
    public function print(Payload $payload): Output;
}

The Output Object ​

Printers return an Output object that can contain:

  • output: The generated code string
  • namespaces: Optional namespace collection. Used by Generators to collect namespaces, deduplicate them, sort alphabetically, and place them at the top of the file.

Practical Example: Searchable Fields Printer ​

Create a printer for Laravel Scout searchable fields:

php
<?php

namespace App\Printers;

use JCSoriano\CrudTemplates\Printers\Printer;
use JCSoriano\CrudTemplates\DataObjects\Output;
use JCSoriano\CrudTemplates\DataObjects\Payload;

class SearchablePrinter implements Printer
{
    public function print(Payload $payload): Output
    {
        $fields = $payload->fields;
        $searchableFields = collect();
        
        // Only include string and text fields as searchable
        foreach ($fields as $field) {
            if (in_array($field->type->name, ['string', 'text'])) {
                $searchableFields->push("'{$field->name->snakeCase()}'");
            }
        }
        
        return new Output($searchableFields->join(",\n            "));
    }
}

Register it in your service provider's register() method:

php
$this->app->bind('crud-templates::printer::searchable', SearchablePrinter::class);

Use in a custom model stub:

php
public function toSearchableArray(): array
{
    return $this->only([
        {{ SEARCHABLE }}
    ]);
}

Using Printers in Custom Generators ​

You can use printers in your custom generators:

php
public function variables(Payload $payload): array
{
    $fillableOutput = $this->print('fillable', $payload);
    $fillableFields = $fillableOutput->output;
    
    // Add to stub variables
    return [
        ...$payload->variables(),
        'FILLABLE' => $fillableFields,
    ];
}

Next Steps ​

  • Check the package source code to dive deeper