Overriding actions | laravel-url-ai-transformer | Spatie       

 SPATIE  

  Laravel URL AI Transformer 
=============================

spatie.be/open-source

  [Docs](https://spatie.be/docs)  [Laravel-url-ai-transformer](https://spatie.be/docs/laravel-url-ai-transformer/v2)  Advanced-usage  Overriding actions

 Version   v2   v1      

 Other versions for crawler [v2](https://spatie.be/docs/laravel-url-ai-transformer/v2) [v1](https://spatie.be/docs/laravel-url-ai-transformer/v1) 

  Overriding actions    
- [ Introduction ](https://spatie.be/docs/laravel-url-ai-transformer/v2/introduction)
- [ Support us ](https://spatie.be/docs/laravel-url-ai-transformer/v2/support-us)
- [ Installation &amp; setup ](https://spatie.be/docs/laravel-url-ai-transformer/v2/installation-setup)
- [ Questions and issues ](https://spatie.be/docs/laravel-url-ai-transformer/v2/questions-issues)
- [ Changelog ](https://spatie.be/docs/laravel-url-ai-transformer/v2/changelog)
- [ About us ](https://spatie.be/docs/laravel-url-ai-transformer/v2/about-us)

Basic usage
-----------

- [ Getting started ](https://spatie.be/docs/laravel-url-ai-transformer/v2/basic-usage/getting-started)
- [ Registering transformations ](https://spatie.be/docs/laravel-url-ai-transformer/v2/basic-usage/registering-transformations)
- [ Writing your own transformers ](https://spatie.be/docs/laravel-url-ai-transformer/v2/basic-usage/writing-your-own-transformers)

Advanced usage
--------------

- [ Structured output ](https://spatie.be/docs/laravel-url-ai-transformer/v2/advanced-usage/structured-output)
- [ Customizing AI models ](https://spatie.be/docs/laravel-url-ai-transformer/v2/advanced-usage/customizing-ai-models)
- [ Customizing the stored result ](https://spatie.be/docs/laravel-url-ai-transformer/v2/advanced-usage/customizing-the-result)
- [ Conditional transformations ](https://spatie.be/docs/laravel-url-ai-transformer/v2/advanced-usage/conditional-transformations)
- [ Crawling URLs ](https://spatie.be/docs/laravel-url-ai-transformer/v2/advanced-usage/crawling-urls)
- [ Exploring command options ](https://spatie.be/docs/laravel-url-ai-transformer/v2/advanced-usage/exploring-command-options)
- [ Regenerating results ](https://spatie.be/docs/laravel-url-ai-transformer/v2/advanced-usage/regenerating-results)
- [ Handling failures ](https://spatie.be/docs/laravel-url-ai-transformer/v2/advanced-usage/handling-failures)
- [ Listening for events ](https://spatie.be/docs/laravel-url-ai-transformer/v2/advanced-usage/events)
- [ Using your own model ](https://spatie.be/docs/laravel-url-ai-transformer/v2/advanced-usage/using-your-own-model)
- [ Customizing the job ](https://spatie.be/docs/laravel-url-ai-transformer/v2/advanced-usage/customizing-the-job)
- [ Overriding actions ](https://spatie.be/docs/laravel-url-ai-transformer/v2/advanced-usage/overriding-actions)
- [ Testing transformers ](https://spatie.be/docs/laravel-url-ai-transformer/v2/advanced-usage/testing-transformers)

 Overriding actions
==================

###  On this page 

1. [ Overriding the fetch action ](#content-overriding-the-fetch-action)
2. [ Overriding the prepare action ](#content-overriding-the-prepare-action)

Actions are classes that handle the core operations of the package. By overriding them, you can customize how low-level operations are performed.

Overriding the fetch action
-----------------------------------------------------------------------------------------------------------------------------------------

Here's an example where we are going to add authentication headers when fetching certain URLs.

```
// app/Actions/CustomFetchUrlContentAction.php
namespace App\Actions;

use Spatie\LaravelUrlAiTransformer\Actions\FetchUrlContentAction;
use Illuminate\Support\Facades\Http;

class CustomFetchUrlContentAction extends FetchUrlContentAction
{
    public function execute(string $url): string
    {
        if (str_contains($url, 'api.mycompany.com')) {
            return Http::withHeaders([
                'Authorization' => 'Bearer '.config('services.internal_api.token'),
                'Accept' => 'application/json',
            ])->get($url)->body();
        }

        return parent::execute($url);
    }
}
```

Register your custom action in the config file:

```
// config/url-ai-transformer.php
return [
    'actions' => [
        'fetch_url_content' => App\Actions\CustomFetchUrlContentAction::class,
        // ... other actions
    ],
];
```

Overriding the prepare action
-----------------------------------------------------------------------------------------------------------------------------------------------

Before the fetched URL content is sent to the AI, it passes through the `PrepareUrlContentAction`. The default implementation removes scripts and styles, strips HTML tags, collapses whitespace, and limits the result to 6000 characters.

By overriding this action, you control what every transformer sends to the AI. Here's an example that keeps only the `` element of a page and allows more characters:

```
// app/Actions/PrepareMainContentAction.php
namespace App\Actions;

use Illuminate\Support\Str;
use Spatie\LaravelUrlAiTransformer\Actions\PrepareUrlContentAction;

class PrepareMainContentAction extends PrepareUrlContentAction
{
    public function execute(string $urlContent): string
    {
        if (preg_match('#]*>(.*?)#is', $urlContent, $matches)) {
            $urlContent = $matches[1];
        }

        return Str::limit(Str::squish(strip_tags($urlContent)), 20000);
    }
}
```

Register it in the config file:

```
// config/url-ai-transformer.php
return [
    'actions' => [
        'prepare_url_content' => App\Actions\PrepareMainContentAction::class,
        // ... other actions
    ],
];
```

A single transformer can still take full control by overriding its `content()` method. In that case, the prepare action is not used for that transformer.

 A good
match?
-------------

### What we do best

- All things Laravel
- Custom frontend components
- Building APIs
- AI-powered features
- Simplifying things
- Clean solutions
- Integrating services

### Not our cup of tea

- WordPress themes
- Cutting corners
- Free mockups to win a job
- "Just execute the briefing"

 In short: we'd like to be a **substantial part** of your project.

 [ Get in touch via email ](mailto:info@spatie.be?subject=A%20good%20match%21&body=Tell%20us%20as%20much%20as%20you%20can%20about%0A-%20your%20online%20project%0A-%20your%20planning%0A-%20your%20budget%0A-%20%E2%80%A6%0A%0AAnything%20that%20helps%20us%20to%20start%20straightforward%21)
