DataTables Editor Event Hooks
[!NOTE] Event hooks allow you to intercept and modify data during CRUD operations.
[!TIP] The type hint
Modelis used, but the actual model type is inferred from the generics (/** @extends DataTablesEditor<User> **/) for static analysis.
Overview
In addition to Laravel's model events, DataTables Editor provides pre and post event hooks for all CRUD actions:
┌─────────────────────────────────────────────────────────────────┐│ Event Hook Flow │├─────────────────────────────────────────────────────────────────┤│ ││ Create: creating → saving → [DB SAVE] → saved → created ││ Edit: updating → saving → [DB SAVE] → saved → updated ││ Remove: deleting → [DB DELETE] → deleted ││ │└─────────────────────────────────────────────────────────────────┘
Create Events
creating - Before Record Creation
Fired before a new record is saved to the database:
/** * @param Model $model Empty model instance * @param array $data Attribute values from Editor * @return array Modified data array */public function creating(Model $model, array $data): array{ // Hash password before saving $data['password'] = bcrypt($data['password']); // Set default values $data['created_by'] = auth()->id(); return $data;}
created - After Record Creation
Fired after a new record is successfully created:
/** * @param Model $model The newly created model * @param array $data Processed data array * @return Model The modified model */public function created(Model $model, array $data): Model{ // Log the creation activity()->log('User created: ' . $model->name); // Send welcome email Mail::to($model)->send(new WelcomeEmail($model)); return $model;}
Edit Events
updating - Before Record Update
Fired before changes are saved to the database:
/** * @param Model $model Model instance from database * @param array $data Attribute values from Editor * @return array Modified data array */public function updating(Model $model, array $data): array{ // Track who made changes $data['updated_by'] = auth()->id(); // Log old vs new values Log::info('Updating user', [ 'old' => $model->toArray(), 'new' => $data, ]); return $data;}
updated - After Record Update
Fired after a record is successfully updated:
/** * @param Model $model Updated model instance * @param array $data Processed data array * @return Model The modified model */public function updated(Model $model, array $data): Model{ // Clear caches Cache::forget("user_{$model->id}"); return $model;}
Save Events
saving - Before Database Save
Fired after creating/updating but before the database save:
[!TIP] Use this hook to modify data for both create and edit operations.
/** * @param Model $model Empty (creating) or original (updating) * @param array $data Data from creating/updating hooks * @return array Modified data array */public function saving(Model $model, array $data): array{ // Sanitize input $data['name'] = strip_tags($data['name']); return $data;}
saved - After Database Save
Fired after created/updated for both create and edit operations:
/** * @param Model $model New (creating) or updated model * @param array $data Processed data array * @return Model The modified model */public function saved(Model $model, array $data): Model{ // Actions for both create and edit Cache::tags(['users'])->flush(); return $model;}
Remove Events
deleting - Before Record Deletion
Fired before the record is deleted from the database:
[!WARNING] The record still exists in the database at this point.
/** * @param Model $model Original model from database * @param array $data Attribute values from Editor */public function deleting(Model $model, array $data): void{ // Delete related files Storage::delete($model->avatar_path); // Delete child records $model->posts()->delete(); // Log the deletion activity()->log('User deleted: ' . $model->name);}
deleted - After Record Deletion
Fired after the record is deleted from the database:
[!TIP] The
$modelinstance still contains the original data.
/** * @param Model $model Original model (no longer in DB) * @param array $data Attribute values from Editor */public function deleted(Model $model, array $data): void{ // Clean up related resources Notification::where('user_id', $model->id)->delete();}
Upload Events
uploaded - After File Upload
Fired after a file is successfully uploaded:
/** * @param string $id Auto-generated file ID from filesystem * @return string The file ID to return to Editor */public function uploaded(string $id): string{ // Generate thumbnail Image::make($id)->resize(100, 100)->save(); return $id;}
Complete Example
<?php// app/DataTables/UsersDataTableEditor.php namespace App\DataTables; use App\Models\User;use Illuminate\Database\Eloquent\Model;use Illuminate\Validation\Rule;use Yajra\DataTables\DataTablesEditor; /** @extends DataTablesEditor<User> **/class UsersDataTableEditor extends DataTablesEditor{ protected $model = User::class; public function creating(Model $model, array $data): array { $data['password'] = bcrypt($data['password']); $data['created_by'] = auth()->id(); return $data; } public function created(Model $model, array $data): Model { Mail::to($model)->send(new WelcomeEmail($model)); return $model; } public function updating(Model $model, array $data): array { $data['updated_by'] = auth()->id(); return $data; } public function updated(Model $model, array $data): Model { Cache::forget("user_{$model->id}"); return $model; } public function createRules(): array { return [ 'name' => 'required', 'email' => 'required|email|unique:users', 'password' => 'required|min:8', ]; } public function editRules(Model $model): array { return [ 'email' => [ 'sometimes', 'required', 'email', Rule::unique('users')->ignore($model->getKey()), ], ]; } public function removeRules(Model $model): array { return [ 'DT_RowId' => 'required|exists:' . $model->getTable() . ',id', ]; }}
Related Documentation
- Editor Rules - Validation rules
- Editor Model - Model configuration
- Laravel Model Events - Built-in model events