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 Crud Generator Laravel Package

yudican/laravel-crud-generator

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation

    composer require yudican/laravel-crud-generator
    php artisan vendor:publish --provider="Yudican\CrudGenerator\CrudGeneratorServiceProvider" --tag="crud-generator-config"
    php artisan migrate
    
  2. First Use Case Generate a basic CRUD for a Post model:

    php artisan crud:generate Post
    
    • This creates:
      • Migration (database/migrations/..._create_posts_table.php)
      • Model (app/Models/Post.php)
      • Controller (app/Http/Controllers/PostController.php)
      • Livewire component (app/Http/Livewire/Posts/Index.php + Create.php/Edit.php)
      • Blade views (resources/views/livewire/posts/...)
      • Routes (routes/web.php)
  3. Where to Look First

    • Config: config/crud-generator.php (adjust table prefixes, default fields, etc.)
    • Commands: app/Console/Commands/CrudGenerateCommand.php (customize generation logic)
    • Livewire Components: app/Http/Livewire/Posts/ (default CRUD structure)

Implementation Patterns

Core Workflow

  1. Generate CRUD

    php artisan crud:generate Post --fields="title:string,body:text,published:boolean"
    
    • Override default fields via CLI or config.
  2. Extend Generated Code

    • Models: Add custom accessors/mutators in app/Models/Post.php after generation.
    public function getTitleAttribute($value) {
        return ucfirst($value);
    }
    
    • Controllers: Extend PostController with custom logic (e.g., validation rules).
    protected function rules() {
        return array_merge(parent::rules(), [
            'slug' => 'required|unique:posts',
        ]);
    }
    
  3. Livewire Customization

    • Override methods in app/Http/Livewire/Posts/Index.php:
    public function mount() {
        $this->query = $this->query->where('published', true);
    }
    
    • Add custom actions (e.g., bulk delete):
    public function bulkDelete() {
        Post::whereIn('id', $this->selected)->delete();
        session()->flash('success', 'Posts deleted!');
    }
    
  4. Reusable Components

    • Extract shared logic into traits or base classes:
    // app/Http/Livewire/Traits/CrudTrait.php
    trait CrudTrait {
        public function save() {
            $this->validate();
            $this->model->save();
            session()->flash('success', 'Saved!');
        }
    }
    
  5. API Integration

    • Use the controller as a base for API endpoints:
    // routes/api.php
    Route::apiResource('posts', \App\Http\Controllers\PostController::class);
    
    • Override PostController to support API responses:
    public function index(Request $request) {
        return response()->json($this->livewire('posts.index')->getPosts());
    }
    

Gotchas and Tips

Pitfalls

  1. Overwriting Existing Files

    • Regenerating a CRUD overwrites all files. Use --force carefully:
    php artisan crud:generate Post --force
    
    • Workaround: Manually merge changes or use --skip-migration to preserve custom migrations.
  2. Livewire Dependency

    • Requires Livewire (laravel/livewire). Install if missing:
    composer require laravel/livewire
    
  3. Route Conflicts

    • Default routes may clash with existing ones. Check routes/web.php after generation.
  4. Model Binding Issues

    • If PostController uses Post::findOrFail($id), ensure the Livewire component passes the correct ID:
    // In Edit.php
    public $postId;
    public function mount($id) {
        $this->postId = $id;
    }
    

Debugging

  1. Generation Errors

    • Check storage/logs/laravel.log for CLI command failures.
    • Validate field syntax (e.g., title:string,body:text must use :).
  2. Livewire Component Not Loading

    • Verify the component is registered in app/Providers/AppServiceProvider.php:
    public function boot() {
        Livewire::component('posts.index', \App\Http\Livewire\Posts\Index::class);
    }
    
    • Clear Livewire view cache:
    php artisan view:clear
    php artisan cache:clear
    

Tips

  1. Custom Field Types Extend the generator to support custom field types (e.g., rich text, file uploads):

    // config/crud-generator.php
    'custom_fields' => [
        'rich_text' => ['type' => 'textarea', 'attributes' => ['rows' => 5]],
    ],
    
  2. Soft Deletes Enable soft deletes in the model and migration:

    php artisan crud:generate Post --soft-deletes
    
    • Adds deleted_at column and scopeQuery to the model.
  3. Authorization Integrate with Laravel’s gates/policies:

    // app/Policies/PostPolicy.php
    public function update(User $user, Post $post) {
        return $user->isAdmin();
    }
    
    • Add checks in Livewire components:
    public function save() {
        $this
            ->authorize('update', $this->post)
            ->validate()
            ->save();
    }
    
  4. Testing Use Laravel’s testing helpers to assert CRUD functionality:

    public function test_crud_operations() {
        $response = $this->get('/posts');
        $response->assertStatus(200);
    
        $this->actingAs(user())
             ->post('/posts', ['title' => 'Test'])
             ->assertRedirect('/posts');
    }
    
  5. Performance

    • Eager Load Relationships: Add with() in the Livewire component’s mount():
    public function mount() {
        $this->posts = Post::with('author')->get();
    }
    
    • Pagination: Use paginate(10) instead of get() for large datasets.
  6. Localization Customize labels and messages in resources/lang/en/crud.php:

    return [
        'posts' => [
            'title' => 'Post Title',
            'create' => 'New Post',
        ],
    ];
    
    • Reference in Blade:
    <x-input-label>{{ __('crud.posts.title') }}</x-input-label>
    
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.
comsave/common
alecsammon/php-raml-parser
chrome-php/wrench
lendable/composer-license-checker
typhoon/reflection
mesilov/moneyphp-percentage
mike42/gfx-php
bookdown/themes
aura/view
aura/html
aura/cli
povils/phpmnd
nayjest/manipulator
omnipay/tests
psr-mock/http-message-implementation
psr-mock/http-factory-implementation
psr-mock/http-client-implementation
voku/email-check
voku/urlify
rtheunissen/guzzle-log-middleware