Installation:
composer require schaefersoft/laravel-base
Publish the package's assets (if needed) via:
php artisan vendor:publish --provider="Schaefersoft\LaravelBase\LaravelBaseServiceProvider" --tag="config"
First Use Case:
FormGenerator to quickly scaffold forms in Blade:
use Schaefersoft\LaravelBase\Useful\FormGenerator;
FormGenerator::make('user', 'POST', route('users.store'))
->addText('name')
->addEmail('email')
->submit('Create User');
Searchable trait to Eloquent models for dynamic search queries:
use Schaefersoft\LaravelBase\Scopes\Searchable;
class User extends Model
{
use Searchable;
}
Then query with:
User::search(['name' => 'John', 'email' => 'test@example.com'])->get();
Blade Components:
Check the resources/views/vendor/laravel-base directory (auto-published) for reusable components like alert, button, or card.
FormGenerator for CRUD forms with minimal boilerplate.
// In a controller:
$form = FormGenerator::make('product', 'PUT', route('products.update', $product))
->addText('name', $product->name)
->addSelect('category_id', Category::pluck('name', 'id'), $product->category_id)
->method('PUT')
->submit('Update');
{!! $form !!}
FormGenerator::validate()).Searchable trait for reusable search logic across models.
// Model:
class Post extends Model
{
use Searchable;
protected $searchable = ['title', 'content']; // Fields to search
}
// Controller:
$posts = Post::search(request()->query())->paginate(10);
Searchable with API resources for filtered responses.@laravelBaseAlert('success', 'User created!')
@laravelBaseButton('Link', route('dashboard'))
php artisan vendor:publish --tag="laravel-base-views"
@laravelBaseTurnstile('site-key')
use Schaefersoft\LaravelBase\Security\Turnstile;
$valid = Turnstile::verify(request('cf-turnstile-response'), 'secret-key');
config/laravel-base.php (e.g., form field types, search behavior).FormGenerator or Searchable traits in unit tests:
$this->partialMock(FormGenerator::class, 'make');
FormGenerator Limitations:
Searchable Trait:
->lower() to queries if needed:
User::search(request()->query())->whereLower('name', 'like', '%john%')->get();
order or group may conflict with SQL keywords; alias them in the $searchable array.Blade Components:
@laravelBase* to prevent clashes.@vite or @stack directives in layouts.Turnstile:
FormGenerator::debug() to inspect generated HTML/attributes.enctype="multipart/form-data" in file upload forms.DB::enableQueryLog() to debug complex searches:
$query = User::search(['name' => 'John']);
$query->toSql(); // Inspect SQL
php artisan view:clear) after modifying component templates.Custom Form Fields:
Schaefersoft\LaravelBase\Useful\FormGenerator to add fields like:
public function addCustomField($name, $value = null, $options = [])
{
// Logic for custom field (e.g., datepicker, tags)
}
FormGenerator::extend('customField', function ($name, $value = null, $options = []) {
return new CustomField($name, $value, $options);
});
Searchable Extensions:
applySearch method in a trait:
class AdvancedSearchable {
public function applySearch(Builder $query, array $search)
{
// Custom logic (e.g., full-text search, fuzzy matching)
}
}
class User extends Model
{
use Searchable, AdvancedSearchable;
}
Blade Directives:
AppServiceProvider:
Blade::directive('laravelBaseCustom', function ($expression) {
return "<?php echo customLogic($expression); ?>";
});
config('laravel-base.form.defaults') to change global settings like:
'defaults' => [
'method' => 'GET', // Default HTTP method
'class' => 'form-control', // Default input class
],
null in $searchable to exclude fields from search:
protected $searchable = ['name', 'email', null]; // Excludes 'email'
config('laravel-base.turnstile').User::with('posts')->search($query)->get();
$posts = Cache::remember('posts-search', now()->addHours(1), function () {
return Post::search($query)->get();
});
How can I help you explore Laravel packages today?