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

时间:2017-09-13 21:45:21

标签: laravel-5.4 service-provider

我创建了一个名为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

这是我第一次尝试使用自定义服务提供商并且不确切知道它是如何工作的我确信有些东西缺失希望您可以提供帮助。提前谢谢。

[UPDATE]

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

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

2 个答案:

答案 0 :(得分:2)

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

如果您想在某些视图中共享变量,您可以创建中间件并将其分配给您希望与之共享数据的视图:

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

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

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

答案 1 :(得分:1)

如果您在一个目录中拥有所有管理员观看次数(例如views\admin),则可以在AdminServiceProvider中使用view composer:

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());
 });