如何覆盖 Laravel Nova 控制器?

Pee*_*eer 4 overriding controller laravel

因为 Laravel Nova 全局搜索忽略策略,所以我想覆盖它的控制器。不知怎的,这不起作用,全局搜索默认为Laravel\Nova\Http\Controllers\SearchController.

到目前为止我所拥有的:

app/config.php


    //..
    'providers' => [

        //..
        App\Providers\RouteServiceProvider::class,
        App\Providers\NovaServiceProvider::class,
       //..
    ],

Run Code Online (Sandbox Code Playgroud)

(请注意提供者的顺序)

routes/web.php

//..
Route::get('nova-api/search', 'SearchController@index');
Run Code Online (Sandbox Code Playgroud)

app/Http/Controllers/SearchController.php


namespace App\Http\Controllers;

use Laravel\Nova\Nova;
use Laravel\Nova\GlobalSearch;
use Laravel\Nova\Http\Requests\NovaRequest;
use Laravel\Nova\Http\Controllers\SearchController as NovaSearchController;

class SearchController extends NovaSearchController
{
    /**
     * Get the global search results for the given query.
     *
     * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
     * @return \Illuminate\Http\Response
     */
    public function index(NovaRequest $request)
    {
        return (new GlobalSearch(
            $request, Nova::globallySearchableResources($request)
        ))->get();
    }
}
Run Code Online (Sandbox Code Playgroud)

版本

  • Laravel 版本:5.8.24
  • 新星版本:2.0.6
  • PHP 版本:7.2.10

这是行不通的。路线nova-api/search仍指向Laravel\Nova\Http\Controllers\SearchController。我究竟做错了什么?

小智 6

我遇到了同样的问题,这就是我解决的方法。

在AppServiceProvider.php中的boot方法中添加以下代码:

$this->app->bind(
   NovaController::class, 
   YourController::class
);
Run Code Online (Sandbox Code Playgroud)

这是它如何工作的描述