dnwk/doctrine-readonly-middleware
Installation:
composer require dnwk/doctrine-readonly-middleware
Ensure your Laravel app uses Doctrine DBAL (e.g., via doctrine/dbal or laravel-doctrine/orm).
First Use Case: Enable readonly mode in a controller/middleware:
use DnwK\DoctrineReadonlyMiddleware\ReadonlyMiddleware;
public function __construct() {
ReadonlyMiddleware::enable(); // Activates readonly mode for the request
}
Where to Look First:
ReadonlyMiddleware::enable() and disable() methods for core logic.Request-Scoped Activation: Enable readonly mode in middleware or controllers for specific routes:
// app/Http/Middleware/ReadonlyMiddleware.php
public function handle($request, Closure $next) {
ReadonlyMiddleware::enable();
return $next($request);
}
Register in app/Http/Kernel.php:
protected $middlewareGroups = [
'web' => [
// ...
\App\Http\Middleware\ReadonlyMiddleware::class,
],
];
Conditional Activation: Toggle based on environment or user roles:
if (app()->environment('staging') || auth()->user()->isAdmin()) {
ReadonlyMiddleware::enable();
}
Doctrine Query Integration: Use with Doctrine repositories/entities:
$entityManager->getRepository(User::class)->find(1); // Readonly enforced
doctrine in config/database.php).$this->app->make(ReadonlyMiddleware::class)->enable();
$this->assertTrue(ReadonlyMiddleware::isEnabled());
if (!ReadonlyMiddleware::isEnabled()) {
$entityManager->persist($entity);
$entityManager->flush();
}
Connection Targeting:
ReadonlyMiddleware::enable('doctrine_replica');
Doctrine\DBAL\Connection events for errors (e.g., preExecuteStatement).Transaction Conflicts:
READ UNCOMMITTED isolation.Caching Quirks:
$entityManager->getConfiguration()->setQueryCacheImpl(null);
Laravel Caching:
ReadonlyMiddleware::setDebug(true); // Logs connection attempts
var_dump(ReadonlyMiddleware::isEnabled()); // Verify activation
connection.connecting to inspect connection parameters:
$eventManager->addEventListener(
ConnectionEvents::CONNECTING,
function (ConnectEventArgs $args) {
var_dump($args->getConnection()->getWrappedConnection()->getReadOnly());
}
);
Custom Readonly Logic:
Override the middleware’s getReadonlyConnection() method to implement custom connection logic (e.g., load balancing).
Environment-Based Activation: Extend the package to auto-enable in specific environments:
// app/Providers/AppServiceProvider.php
public function boot() {
if (app()->environment('production')) {
ReadonlyMiddleware::enable();
}
}
Fallback to Write Connection: Implement a fallback mechanism for critical writes:
try {
ReadonlyMiddleware::enable();
$result = $entityManager->createQuery(...)->getResult();
} catch (ReadonlyException $e) {
ReadonlyMiddleware::disable();
// Retry with write connection
}
How can I help you explore Laravel packages today?