Comparte:
Model-binding + cache
Tengo el siguiente conflicto para utilizar CACHE, dado que mi Controlador usa el Model-binding provisto por Laravel
Enlace para mostrar un empleado:
Enlace para mostrar un empleado:
<a href="{{ route('employee.show', $employee) }}">
Enlace a show
</a>
web.php:
Route::get('employee/{employee}', [EmployeeController::class, 'show'])->name('employee.show');
app/Http/Controller/EmployeeController.php
class EmployeeController extends Controller
{
...
public function show(Employee $employee): View
{
return view('employees.show',compact('employee'));
}
Mi pregunta es: Cómo puedo hacer para que el llamado a mi función que usa el model-binding (que hace una consulta a la Base de Datos [select * from `employees` where `id` = 1 limit 1]) pueda utilizar cache y no ejecute esa consulta.
Actualmente lo solucioné enviando el id en lugar del objeto completo (quitando el model-binding):
Enlace para mostrar un empleado:
<a href="{{ route('employee.show', $employee->id) }}">
Enlace a show
</a>
app/Http/Controller/EmployeeController.php
----------------------------------
class EmployeeController extends Controller
{
...
public function show($id): View
{
$employee = Cache::remember('employee.{$id}', 3600, function() use($id){
return Employee::find($id);
});
return view('employees.show',compact('employee'));
}
Pero quiero saber si existe alguna sintaxis que me permita seguir enviando el objeto completo y utilizar caché.
Gracias
// app/Providers/RouteServiceProvider.php use App\Models\Employee; class RouteServiceProvider extends ServiceProvider { public function boot() { parent::boot(); Route::bind('employee', function ($value) { // Si el valor es un número, asumimos que es un ID if (is_numeric($value)) { return Cache::remember("employee.{$value}", 3600, function () use ($value) { return Employee::find($value); }); } // Si es un objeto Employee, simplemente lo devolvemos if ($value instanceof Employee) { return $value; } // Puedes agregar lógica adicional aquí según tus necesidades return null; }); } }