如何在 Laravel 的服务提供者 Provider 中使用 Trait

这是我的 Trait ,它的 get_admin_menus () 方法可以返回管理员界面的 左侧菜单数据

<?php

namespace App\Traits;

use App\Model\AdminMenu;

trait AdminMenuTrait
{
    protected $admin_menu_model;

    /**
     * constructor
     *
     * @param AdminMenu $admin_menu_model
     */
    public function __construct(AdminMenu $admin_menu_model)
    {
        $this->admin_menu_model = $admin_menu_model;
    }

    /**
     * @param bool $tree 是否以 tree 结构返回
     * @return array
     */
    public function get_admin_menus($tree = true)
    {
        $admin_menus = $this->admin_menu_model->all()->toArray();
        return $tree ? list_to_tree($admin_menus) : $admin_menus;
    }
}

我想在服务提供者 AppServiceProvider 的 boot () 方法中向所有视图共享 ```左侧菜单数据````

下面是我 AppServiceProvier 中的代码 ,核心代码就是在 boot () 中调用了 Trait 的 $this->get_admin_menus () 获取 左侧菜单数据 ,然后使用 view ()->share () 向所有视图共享

<?php

namespace App\Providers;

use App\Model\AdminMenu;
use Illuminate\Support\ServiceProvider;
use App\Traits\AdminMenuTrait;

class AppServiceProvider extends ServiceProvider
{
    use AdminMenuTrait;

    protected $admin_menu_model;

    /**
     * constructor
     *
     * @param AdminMenu $admin_menu_model
     */
    public function __construct(AdminMenu $admin_menu_model)
    {
        $this->admin_menu_model = $admin_menu_model;
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
        view()->share('admin_menu_tree_list', $this->get_admin_menus());
    }
}

然后运行 ,出现了报错信息 ,我在网上搜了一下 ,但是没解决这个问题

Argument 1 passed to App\Providers\AppServiceProvider::__construct() must be an instance of App\Model\AdminMenu, instance of Illuminate\Foundation\Application given, called in D:\WWW\laravel_admin\vendor\laravel\framework\src\Illuminate\Foundation\Application.php on line 679

如何在 Laravel 的服务提供者 Provider 中使用 Trait

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

ServiceProvider 的构造函数是这样的:

public function __construct($app)
 {
     $this->app = $app;
 }

Laravel 注册服务提供者时传给它的会是一个 Illuminate\Foundation\Application 类的实例,不会是你自己定的那个类。

你这里的 Trait 设计很不合理,它依赖外部的模型类,应该去掉构造函数,然后引入到 AdminMenu 模型,而不是引入到 AppServiceProvider。AdminMenu 模型引入 trait 之后,boot 方法中就可以:view()->share('admin_menu_tree_list', AdminMunu::get_admin_menus());, 注意引入模型的命名空间,get_admin_menus 定义为静态方法。

5年前 评论
cangsongbayu (楼主) 5年前
讨论数量: 1

ServiceProvider 的构造函数是这样的:

public function __construct($app)
 {
     $this->app = $app;
 }

Laravel 注册服务提供者时传给它的会是一个 Illuminate\Foundation\Application 类的实例,不会是你自己定的那个类。

你这里的 Trait 设计很不合理,它依赖外部的模型类,应该去掉构造函数,然后引入到 AdminMenu 模型,而不是引入到 AppServiceProvider。AdminMenu 模型引入 trait 之后,boot 方法中就可以:view()->share('admin_menu_tree_list', AdminMunu::get_admin_menus());, 注意引入模型的命名空间,get_admin_menus 定义为静态方法。

5年前 评论
cangsongbayu (楼主) 5年前