Installation
composer require rasrobin/crud:^0.2.0
php artisan vendor:publish --tag=public --force
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
}
}
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;
}
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>
Register Routes
In routes/web.php:
Route::resource('posts', PostController::class);
Test
Visit /posts to see the auto-generated CRUD interface.
For a rapid admin panel, leverage the package’s built-in scaffolding:
/posts (index)./posts/create and /posts/{id}/edit.HasCrud docs).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
}
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);
}
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()
Dynamic Field Handling
Use @crudInput() for dynamic field rendering:
@crudInput('content', 'textarea', ['class' => 'form-control', 'rows' => 5])
CrudController and override rules():
protected function rules()
{
return [
'title' => 'required|unique:posts',
'content' => 'required|min:10',
];
}
show()).crudFields():
public static function crudFields()
{
return [
'title',
'category_id' => ['label' => 'Category', 'type' => 'select', 'options' => Category::pluck('name', 'id')],
];
}
crudActions() in the model:
public static function crudActions()
{
return [
'publish' => ['label' => 'Publish', 'route' => 'posts.publish', 'method' => 'POST'],
];
}
Template Paths
crudFormTemplate() must return a relative path (e.g., 'posts.form'), not an absolute URL.view() helper or resource_path() if needed:
return view()->exists('posts.form') ? 'posts.form' : 'default.form';
CSRF Token
@crudFormOpen() may cause CSRF failures.@crudFormOpen()/@crudFormClose().Soft Deletes
SoftDeletes trait in the model.use Illuminate\Database\Eloquent\SoftDeletes;
class Post extends Model implements HasCrud {
use SoftDeletes;
protected $dates = ['deleted_at'];
}
JavaScript Dependencies
public/js/crud.js is included in your layout:
<script src="{{ asset('vendor/crud/js/crud.js') }}"></script>
Model Binding
{{ $model->field }} fails if crudFields() excludes the field.crudFields().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"
Log Model Events
Override CrudController methods to debug:
public function store(Request $request)
{
\Log::info('CRUD Store Data:', $request->all());
return parent::store($request);
}
Template Debugging
Use @dd($model) in Blade templates to inspect passed data.
Custom Directives
Extend Blade directives in AppServiceProvider:
Blade::directive('crudCustom', function ($expression) {
return "<?php echo customCrudLogic($expression); ?>";
});
Override Default Views Publish and modify views:
php artisan vendor:publish --tag=crud-views --force
Edit resources/views/vendor/crud/ templates.
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']);
Localization
Override labels in crudFields():
public static function crudFields()
{
return [
'title' => ['label' => trans('crud.posts.title')],
];
}
CrudController:
public function index()
{
$this->model = $this->model->with('category');
return parent::index();
}
CrudController:
protected $perPage = 10;
How can I help you explore Laravel packages today?