Laravel 多鍵路由繫結

心智極客發表於2019-09-25

Laravel 可以透過兩種方式進行路由模型繫結。

在模型中指定路由的鍵

/**
 * 獲取該模型的路由的自定義鍵名。
 *
 * @return string
 */
public function getRouteKeyName()
{
    return 'slug';
}

在服務提供者中手動進行繫結

Route::bind('post', function ($value) {
    return App\Post::where('slug', $value)->first() ?? abort(404);
 });
}

如何同時支援 idslug 的路由模型繫結呢?同樣有兩種方式實現。

一是在模型重寫 resolveRouteBinding 方法

/**
 * Retrieve the model for a bound value.
 *
 * @param  mixed  $value
 * @return \Illuminate\Database\Eloquent\Model|null
 */
public function resolveRouteBinding($value)
{
    return $this->where($this->getRouteKeyName(), $value)->first();
}

重寫

/**
 * Retrieve the model for a bound value.
 *
 * @param  mixed  $value
 * @return \Illuminate\Database\Eloquent\Model|null
 */
public function resolveRouteBinding($value)
{
    if( is_numeric($value) ){
        return self::findOrFail($value);
    } else {
        return self::whereSlug($value)->firstOrFail();
    }
}

也可以在服務提供者中進行繫結

Route::bind('post', function ($value) {
    if( is_numeric($value) ){
        return App\Post::findOrFail($value);
    } else {
        return App\Post::whereSlug($value)->firstOrFail();
    }
 });
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章