Laravel 5.4: 将自定义服务提供者附加到控制器

Laravel 5.4: attach custom service provider to a controller

我创建了一个名为 AdminServiceProvider 的服务提供者

namespace App\Providers;
use Modules\Orders\Models\Orders;
use Illuminate\Support\ServiceProvider;
use View;
class AdminServiceProvider extends ServiceProvider
    {

        public function boot()
        {
            $comments = Orders::get_new_comments();
            View::share('comments', $comments);
        }
        public function register()
        {

        }
    }

注册提供商

App\Providers\AdminServiceProvider::class,

现在我尝试将它附加到控制器

namespace App\Http\Controllers\admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Providers\AdminServiceProvider;

class AdminController extends Controller
{
    public $lang;

    public function __construct()
    {
    }

    public function index(){
        return view('admin/dashboard');
    }
}

现在我收到此错误消息

Undefined variable: comments

这是我第一次尝试使用自定义服务提供者,我不知道它到底是如何工作的,我敢肯定有什么遗漏希望你能帮忙。提前致谢。

[更新]

删除了使用 App\Providers\AdminServiceProvider;来自控制器

php artisan clear-compiled 解决了这个问题,但我想将它附加到一些控制器而不是所有控制器,因为 $comments 被发送到我应用程序中的所有控制器。那么如何将服务提供者附加到特定控制器而不是所有控制器?

对于未定义的变量运行:php artisan clear-compiled会解决

如果你想在你的一些视图中共享一个变量你可以创建一个中间件并将它分配给你想与之共享数据的视图:

  • 首先创建一个中间件:php artisan make:middleware someName
  • 然后在句柄函数中添加视图共享逻辑:
 $comments = Orders::get_new_comments(); 
 view()->share('comments',$comments);
 return $next($request);    
  • 然后在$routeMiddleware数组下注册你的中间件,然后 给它一个别名。

然后将其附加到您的路线中,例如:

Route::group(['middleware'=> 'yourMiddlewwareName'], function(){
  //your routes
});

如果您将所有管理视图都放在一个目录中(例如 views\admin),您可以在 AdminServiceProvider 中使用视图编辑器:

public function boot()
{
        view()->composer('admin.*', function($view){
             $view->with('comments', Orders::get_new_comments());
        });

}

它会将 comments 变量附加到 views\admin 目录中的每个视图。

您还可以将变量附加到某些特定的视图或文件夹,如下所示:

view()->composer(['admin.posts.*', 'admin.pages.index'], function($view){
      $view->with('comments', Orders::get_new_comments());
 });