Search code examples
phplaraveleloquentlaravel-routing

Custom model binding when using withTrashed method on Route declaration and resolveRouteBinding in Model


I am having a problem with implicit model binding on routes for Soft Deleted Models. When using the withTrashed method, the resolveRouteBinding method in the Model is NOT called. When withTrashed method is removed from the route declaration, the method resolveRouteBinding is called as expected.

Steps To Reproduce:

routes/web.php

Route::get('user/{user}', function(SoftDeletedModel $user) {
    dd($user);
})->withTrashed(); //withTrashed is used

Models/SoftDeletedModel.php

use SoftDeletes;

public function resolveRouteBinding($value, $field = null) {
    dd("Successfully Substituted Bindings when using WithTrashed."); //This is not displayed.
    return parent::resolveRouteBinding($value, $field);
}

Is this a known bug or where am I going wrong? There also exists an issue on github


Solution

  • You need to use this method resolveSoftDeletableRouteBinding instead of resolveRouteBinding.

        /**
         * Retrieve the model for a bound value.
         *
         * @param mixed $value
         * @param string|null $field
         *
         * @return \Illuminate\Database\Eloquent\Model|null
         */
        public function resolveSoftDeletableRouteBinding($value, $field = null)
        {
            
             return parent::resolveSoftDeletableRouteBinding($value, $field);
        }