Weave 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

Crud Laravel Package

rasrobin/crud

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Steps to First CRUD Page

  1. Installation

    composer require rasrobin/crud:^0.2.0
    php artisan vendor:publish --tag=public --force
    
  2. Create Migration & Model

    php artisan make:migration create_posts_table
    php artisan make:model Post -m
    

    Update the migration and model (app/Post.php):

    namespace App;
    
    use Rasrobin\Crud\HasCrud;
    
    class Post extends Model implements HasCrud
    {
        public static function crudFormTemplate()
        {
            return 'posts.form'; // Blade template path
        }
    }
    
  3. Generate Controller

    php artisan make:controller PostController --resource
    

    Extend CrudController and set $model:

    use Rasrobin\Crud\CrudController;
    
    class PostController extends CrudController
    {
        public $model = Post::class;
    }
    
  4. Create Blade Template Create resources/views/posts/form.blade.php with form fields (Bootstrap classes included):

    <div class="form-group">
        <label>Title</label>
        <input type="text" name="title" class="form-control">
    </div>
    
  5. Register Routes In routes/web.php:

    Route::resource('posts', PostController::class);
    
  6. Test Visit /posts to see the auto-generated CRUD interface.


First Use Case: Quick Admin Panel

For a rapid admin panel, leverage the package’s built-in scaffolding:

  • List View: Auto-generated at /posts (index).
  • Create/Edit: Auto-routed to /posts/create and /posts/{id}/edit.
  • Delete: Soft-deletes enabled by default (check HasCrud docs).

Implementation Patterns

Core Workflow

  1. Model Integration Implement HasCrud and define:

    • crudFormTemplate(): Path to form Blade template.
    • crudFields() (optional): Customize displayed fields.
      public static function crudFields()
      {
          return ['title', 'content']; // Only show these fields
      }
      
  2. Controller Customization Override methods in CrudController:

    public function store(Request $request)
    {
        // Custom validation/logic before save
        $this->validate($request, ['title' => 'required|max:255']);
        return parent::store($request);
    }
    
  3. View Structure Use provided Blade directives:

    • @crudFormOpen(): Opens form with CSRF token.
    • @crudFormClose(): Closes form.
    • @crudSubmitButton(): Generates submit button. Example (posts/form.blade.php):
    @crudFormOpen()
        <div class="form-group">
            <label>Title</label>
            @crudInput('title', 'text', ['class' => 'form-control'])
        </div>
        @crudSubmitButton('Save Post')
    @crudFormClose()
    
  4. Dynamic Field Handling Use @crudInput() for dynamic field rendering:

    @crudInput('content', 'textarea', ['class' => 'form-control', 'rows' => 5])
    

Integration Tips

  • Validation: Extend CrudController and override rules():
    protected function rules()
    {
        return [
            'title' => 'required|unique:posts',
            'content' => 'required|min:10',
        ];
    }
    
  • Authorization: Use Laravel’s gates/policies within overridden methods (e.g., show()).
  • Relationships: Handle belongsTo/manyToMany via crudFields():
    public static function crudFields()
    {
        return [
            'title',
            'category_id' => ['label' => 'Category', 'type' => 'select', 'options' => Category::pluck('name', 'id')],
        ];
    }
    
  • Custom Actions: Add buttons via crudActions() in the model:
    public static function crudActions()
    {
        return [
            'publish' => ['label' => 'Publish', 'route' => 'posts.publish', 'method' => 'POST'],
        ];
    }
    

Gotchas and Tips

Pitfalls

  1. Template Paths

    • Issue: crudFormTemplate() must return a relative path (e.g., 'posts.form'), not an absolute URL.
    • Fix: Use view() helper or resource_path() if needed:
      return view()->exists('posts.form') ? 'posts.form' : 'default.form';
      
  2. CSRF Token

    • Issue: Forgetting @crudFormOpen() may cause CSRF failures.
    • Fix: Always wrap forms with @crudFormOpen()/@crudFormClose().
  3. Soft Deletes

    • Issue: Soft deletes require SoftDeletes trait in the model.
    • Fix: Add to your model:
      use Illuminate\Database\Eloquent\SoftDeletes;
      class Post extends Model implements HasCrud {
          use SoftDeletes;
          protected $dates = ['deleted_at'];
      }
      
  4. JavaScript Dependencies

    • Issue: Missing jQuery/Bootstrap causes UI glitches.
    • Fix: Ensure public/js/crud.js is included in your layout:
      <script src="{{ asset('vendor/crud/js/crud.js') }}"></script>
      
  5. Model Binding

    • Issue: {{ $model->field }} fails if crudFields() excludes the field.
    • Fix: Ensure all used fields are listed in crudFields().

Debugging Tips

  1. Check Published Assets Verify public/js/crud.js exists after vendor:publish. If not, run:

    php artisan vendor:publish --tag=public --force --provider="Rasrobin\Crud\CrudServiceProvider"
    
  2. Log Model Events Override CrudController methods to debug:

    public function store(Request $request)
    {
        \Log::info('CRUD Store Data:', $request->all());
        return parent::store($request);
    }
    
  3. Template Debugging Use @dd($model) in Blade templates to inspect passed data.


Extension Points

  1. Custom Directives Extend Blade directives in AppServiceProvider:

    Blade::directive('crudCustom', function ($expression) {
        return "<?php echo customCrudLogic($expression); ?>";
    });
    
  2. Override Default Views Publish and modify views:

    php artisan vendor:publish --tag=crud-views --force
    

    Edit resources/views/vendor/crud/ templates.

  3. Add Custom Routes Extend CrudController to handle extra routes:

    public function customAction()
    {
        return view('posts.custom');
    }
    

    Add to routes/web.php:

    Route::post('posts/{post}/publish', [PostController::class, 'customAction']);
    
  4. Localization Override labels in crudFields():

    public static function crudFields()
    {
        return [
            'title' => ['label' => trans('crud.posts.title')],
        ];
    }
    

Performance Quirks

  • Eager Loading: Manually eager-load relationships in CrudController:
    public function index()
    {
        $this->model = $this->model->with('category');
        return parent::index();
    }
    
  • Pagination: Defaults to 15 items/page. Override in CrudController:
    protected $perPage = 10;
    
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.
thomas-0816/doctrine-dbal-duckdb
moyisoft/laravel-admin
oxygen/mod-pages
oxygen/mod-import-export
oxygen/mod-media
ksoft/laravel-contentbuilderjs
ourgoldpackages/exchange
mikkimike/laravel-exchange1c
wandesnet/mercadopago-laravel
tsfcorp/email
larafony/core
laravel-enso/currencies
tartan/laravel-online-payment
gam/laravel-sat-catalogs
cloudcreativity/laravel-stripe
abdulelahragih/querybuilder
wedevbr/celcoin-laravel
surazdott/nepali-date
devsquad-cockpit/laravel
coding-socks/laravel-upload-handler