Installation
composer require badpixxel/paddock-core
Ensure badpixxel/paddock-core is added to config/app.php under providers.
Publish Configuration
php artisan vendor:publish --provider="Badpixxel\PaddockCore\PaddockCoreServiceProvider" --tag="config"
This generates config/paddock.php with default settings.
Basic Setup
Register the service provider in config/app.php:
Badpixxel\PaddockCore\PaddockCoreServiceProvider::class,
First Use Case: Model Binding
Bind a model to a route parameter (e.g., User):
use Badpixxel\PaddockCore\Traits\PaddockBindable;
class UserController extends Controller
{
use PaddockBindable;
public function show($id)
{
$user = $this->bindModel(User::class, $id);
// Use $user...
}
}
Model Binding
PaddockBindable trait for automatic model binding in controllers:
$model = $this->bindModel(Model::class, $id, ['column' => 'value']);
$model = $this->bindModel(Model::class, $id, [], ['with' => ['relation']]);
API Resource Handling
PaddockResource:
use Badpixxel\PaddockCore\Resources\PaddockResource;
class UserResource extends PaddockResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
];
}
}
return new UserResource($user);
Request Validation
PaddockFormRequest for validation:
use Badpixxel\PaddockCore\Http\Requests\PaddockFormRequest;
class StoreUserRequest extends PaddockFormRequest
{
public function rules()
{
return [
'name' => 'required|string|max:255',
'email' => 'required|email',
];
}
}
Service Layer Integration
PaddockService trait for dependency injection:
use Badpixxel\PaddockCore\Traits\PaddockService;
class UserService
{
use PaddockService;
public function create(array $data)
{
return User::create($data);
}
}
PaddockResource for seamless frontend-backend data flow.PaddockResource to version API responses without duplicating logic.PaddockBindable and PaddockService traits in unit tests:
$controller->partialMock(PaddockBindable::class, ['bindModel']);
Model Binding Scope
PaddockBindable respects Laravel’s default model binding scope (e.g., Route::model()). Override with:
$this->bindModel(Model::class, $id, [], ['scope' => 'active']);
Resource Caching
PaddockResource does not cache responses by default. For performance, implement shouldCache():
public function shouldCache()
{
return true;
}
Validation Rules
PaddockFormRequest rules may conflict with Laravel’s built-in validation. Use merge() to combine:
public function rules()
{
return array_merge(parent::rules(), ['custom_field' => 'required']);
}
Service Provider Conflicts
Paddock-like packages, ensure service provider binding order in config/app.php.config/paddock.php for bindable_models whitelist. Add your model:
'bindable_models' => [
'App\Models\User',
'App\Models\Post',
],
dd($this->resource) in toArray() to debug output.Custom Binders
Override PaddockBindable::resolveModel() for custom logic:
protected function resolveModel($model, $id, $extra = [], $options = [])
{
if ($model === User::class && $id === 'guest') {
return User::where('email', '[email protected]')->first();
}
return parent::resolveModel($model, $id, $extra, $options);
}
Dynamic Resources
Extend PaddockResource for dynamic fields:
public function toArray($request)
{
return array_merge(
parent::toArray($request),
['dynamic_field' => $request->input('dynamic_field')]
);
}
Middleware Integration
Use PaddockMiddleware for pre-binding checks:
class EnsureActiveUser
{
use PaddockMiddleware;
public function handle($request, Closure $next)
{
$user = $this->bindModel(User::class, $request->user()->id);
if (!$user->isActive()) {
abort(403);
}
return $next($request);
}
}
How can I help you explore Laravel packages today?