Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Meta Generator Laravel Package

augustpermana/laravel-meta-generator

Attach and manage key-value metadata for Eloquent models without altering main tables. Provides auto type detection and casting, a MetaModel base, and artisan commands to generate meta models and clean orphaned records for easy setup and maintenance.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation:

    composer require augustpermana/laravel-meta-generator
    

    Publish the config file:

    php artisan vendor:publish --provider="Augustpermana\MetaGenerator\MetaGeneratorServiceProvider" --tag="config"
    
  2. Basic Usage: Define metadata for a model in its meta() method:

    use Augustpermana\MetaGenerator\MetaGenerator;
    
    class Post extends Model
    {
        public function meta()
        {
            return [
                'title' => 'Default Post Title',
                'description' => 'Default description',
                'keywords' => ['laravel', 'meta', 'generator'],
            ];
        }
    }
    
  3. First Use Case: Retrieve metadata for a model instance:

    $post = Post::find(1);
    $meta = MetaGenerator::get($post); // Returns ['title', 'description', 'keywords']
    

Implementation Patterns

Dynamic Metadata

Use closures for dynamic metadata (e.g., SEO-friendly titles):

public function meta()
{
    return [
        'title' => function ($post) {
            return "Read '{$post->title}' on {$this->app->make('App\Services\SiteNameService')}";
        },
    ];
}

Fallback Values

Define fallback metadata in config/meta-generator.php:

'fallbacks' => [
    'title' => 'Default Site Title',
    'description' => 'Default description for all pages',
],

Integration with Blade

Generate <meta> tags in views:

@foreach(MetaGenerator::get($post) as $name => $value)
    <meta name="{{ $name }}" content="{{ $value }}">
@endforeach

API Responses

Attach metadata to API responses (e.g., Laravel Sanctum):

use Augustpermana\MetaGenerator\MetaGenerator;

return response()->json([
    'data' => $post,
    'meta' => MetaGenerator::get($post),
]);

Model Events

Update metadata on model events (e.g., updated):

protected static function boot()
{
    static::updated(function ($model) {
        $model->meta['last_updated'] = now()->toDateTimeString();
    });
}

Gotchas and Tips

Pitfalls

  1. Caching Issues:

    • Metadata closures are evaluated per request. Avoid expensive operations (e.g., DB queries) in closures.
    • Clear cached views if metadata changes dynamically but isn’t reflecting.
  2. Overriding Defaults:

    • Fallback values in config/meta-generator.php are merged after model-specific metadata. Explicitly set null to override:
      return ['title' => null]; // Disables fallback title
      
  3. Nested Relationships:

    • Metadata is resolved on the model instance, not related models. Use with() to eager-load dependencies:
      $post = Post::with('author')->find(1);
      $meta = MetaGenerator::get($post); // Access $post->author if needed
      

Debugging

  • Log Metadata:
    \Log::debug('Post Meta', MetaGenerator::get($post));
    
  • Check Config: Run php artisan config:clear if fallbacks aren’t applying.

Extension Points

  1. Custom Resolvers: Extend the MetaGenerator class to add logic:

    class CustomMetaGenerator extends MetaGenerator
    {
        public function get($model)
        {
            $meta = parent::get($model);
            $meta['custom_field'] = $this->resolveCustomField($model);
            return $meta;
        }
    }
    

    Bind it in AppServiceProvider:

    $this->app->bind(MetaGenerator::class, function ($app) {
        return new CustomMetaGenerator($app);
    });
    
  2. Model Observers: Sync metadata with external services (e.g., Google Search Console):

    class PostObserver
    {
        public function saved(Post $post)
        {
            $meta = MetaGenerator::get($post);
            // Send to external API
        }
    }
    
  3. Middleware: Inject metadata into the request or session:

    public function handle($request, Closure $next)
    {
        $request->merge(['meta' => MetaGenerator::get($request->route('model'))]);
        return $next($request);
    }
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
jayeshmepani/jpl-moshier-ephemeris-php
elnasnato/laraliveui
labrodev/rest-sdk
sampaui/sampaui
babelqueue/php-sdk
facebook/capi-param-builder-php
babelqueue/symfony
hamzi/corewatch
minionfactory/raw-hydrator
hexters/coinpayment
rjcodes/rjcms
act-training/laravel-permissions-manager
alimarchal/laravel-chart-of-accounts
babenkoivan/elastic-scout-driver
mkwebdesign/filament-watchdog-v5
renatomarinho/laravel-page-speed
zedmagdy/filament-business-hours
renatovdemoura/blade-elements-ui
devgeek/beacon-admin
benjamin-rqt/data-watcher-bundle