bonnier/context-laravel
Laravel service provider and middleware for registering a request context. Install via Composer, add the ContextServiceProvider in config/app.php, and enable the RegisterContext middleware in Http/Kernel.php to make context available across your app.
Installation
composer require bonnier/context-laravel
Publish the config file:
php artisan vendor:publish --provider="Bonnier\Context\ContextServiceProvider"
Configuration
Edit config/context.php to define your context keys (e.g., locale, country, theme):
'keys' => [
'locale' => 'en',
'country' => 'us',
'theme' => 'light',
],
First Use Case
Inject the Context facade into a controller or service:
use Bonnier\Context\Facades\Context;
public function index()
{
// Set a context value
Context::set('locale', 'sv');
// Get a context value
$locale = Context::get('locale');
// Check if a context exists
if (Context::has('theme')) {
// ...
}
}
Middleware Integration
Use the ContextMiddleware to set context values from request data (e.g., URL parameters or headers):
Route::get('/{locale}', function ($locale) {
// ...
})->middleware('context');
Configure middleware in app/Http/Kernel.php:
protected $middleware = [
// ...
\Bonnier\Context\Middleware\ContextMiddleware::class,
];
Dynamic Context Resolution Override default values based on request context (e.g., locale from subdomain):
public function handle($request, Closure $next)
{
$locale = $request->getHost(); // e.g., "sv.example.com"
Context::set('locale', str_replace('.', '', $locale));
return $next($request);
}
Context-Aware Views Pass context to Blade templates:
return view('welcome', [
'context' => Context::all(),
]);
In Blade:
<html lang="{{ $context['locale'] }}">
Service Provider Binding
Bind context-dependent services in AppServiceProvider:
public function boot()
{
$this->app->bind(
\App\Services\LocalizationService::class,
function ($app) {
return new \App\Services\LocalizationService(
Context::get('locale')
);
}
);
}
Fallback Logic
Use Context::get('key', 'fallback') to handle missing keys gracefully:
$country = Context::get('country', 'us');
X-Locale):
Context::set('locale', $request->header('X-Locale'));
Context::shouldReceive('get')->with('locale')->andReturn('test');
$cacheKey = 'user_'.Context::get('locale').'_data';
Middleware Order Matters
Ensure ContextMiddleware runs before other middleware that relies on context (e.g., localization). Add it early in $middleware or $middlewareGroups.
Config Overrides
Default values in config/context.php are not merged with runtime values. Explicitly set keys in middleware or controllers:
// ❌ Won't override config
Context::set('locale', 'sv'); // If 'locale' is already 'en' in config
// ✅ Correct: Override explicitly
Context::set('locale', 'sv', true); // Force override (if method supports it)
Note: The package may not support forced overrides; check the source.
Thread Safety Context is likely not thread-safe. Avoid setting context in queues or background jobs unless explicitly designed for it.
Deprecated Methods
The package is outdated (last release: 2020). Assume undocumented methods may break. Prefer get(), set(), and has().
public function handle($request, Closure $next)
{
\Log::debug('Current context:', Context::all());
return $next($request);
}
\Log::debug('Available keys:', array_keys(Context::all()));
Custom Context Sources
Extend ContextMiddleware to add new sources (e.g., database):
public function handle($request, Closure $next)
{
$userContext = UserContext::resolve($request->user());
Context::merge($userContext);
return $next($request);
}
Event-Based Context
Trigger events when context changes (e.g., ContextUpdated):
Context::set('locale', 'sv');
event(new \App\Events\ContextUpdated('locale', 'sv'));
Override Facade Replace the facade for custom logic:
Facades\Context::swap(new \App\Services\CustomContext);
theme), cache values:
$theme = Cache::remember("context.theme", 3600, function() {
return Context::get('theme');
});
How can I help you explore Laravel packages today?