【问题标题】:How to access a packages methods?如何访问包方法?
【发布时间】:2017-04-08 15:02:11
【问题描述】:

我正在开发一个 laravel 包,在包内我有一个处理数据的存储库。

当用户安装包时,我怎样才能让他们与他们的应用程序中的存储库进行交互?

我是否应该设置一个外观,以便他们可以执行以下操作:

SuperPackage::getSomeData();

或者我应该使用其他方式吗?

文档状态:

在构建与 Laravel 交互的第三方包时,它是 最好注入 Laravel 合约而不是使用外观。自从 软件包是在 Laravel 本身之外构建的,您将无权访问 到 Laravel 的门面测试助手。

我想这只是为了包的内部,在外部调用包,外观仍然可以吗?

【问题讨论】:

    标签: laravel laravel-5 laravel-5.3


    【解决方案1】:

    由于您几乎需要编写一个服务提供程序来将您的包集成到用户的应用程序中,我认为您应该使用合同通过依赖注入来使您的包可用。我认为为了方便而提供外观也没有什么坏处,因为实际上它只是一个额外的文件,它引用了您的服务提供商中的某些内容。

    您的合同:

    namespace Your\Package;
    
    public interface YourPackageContract
    {
        public function availableMethod();
    }
    

    您的实施:

    namespace Your\Package;
    
    class YourPackage implements YourContract
    {
        public function availableMethod()
        {
            //  Implement your method
        }
    }
    

    您的服务提供商:

    namespace Your\Package;
    
    use Illuminate\Support\ServiceProvider;
    
    class YourPackageServiceProvider extends ServiceProvider
    {
        public function register()
        {
            // Tell Laravel that when an instance of YourPackageContract is requested, an instance of YourPackage should be returned
            $this->app->singleton('Your\Package\YourPackageContract', function($app) {
                return new YourPackage();
            });
        }
    
        public function provides()
        {
            return ['Your\Package\YourPackageContract'];
        }
    }
    

    你的门面:

    namespace Your\Package\Facades;
    
    use Illuminate\Support\Facades\Facade;
    
    class YourPackage extends Facade
    {
        public function getFacadeAccessor()
        {
            return 'Your\Package\YourPackageContract';
        }
    }
    

    在控制器中的使用:

    class SomeController
    {
        public function index(YourPackageContract $yourPackage)
        {
            // $yourPackage should now be an instance of YourPackage
            $yourPackage->availableMethod();
    
            // You can also use the Facade which refers to the same instance
            YourPackage::availableMethod();
        }
    }
    

    如果您想创建多种访问类的方式、具有更易读的名称等,您始终可以在服务提供者中使用 ->alias() 方法。

    注意:这里是直​​接写的,还没来得及测试。

    【讨论】:

    • 谢谢,用户如何通过依赖注入访问存储库中的方法?他们是否必须注入存储库类?或者他们可以只使用包名吗?你能给我一个粗略的例子吗?我担心它是否是存储库类,那么这依赖于用户知道存储库名称,而外观似乎更容易。
    • 我已经用一个例子更新了我的答案,但我还没有测试任何东西。
    • 感谢更新的答案,所以我需要参考存储库接口进行依赖注入。我还有一个问题,假设我可能有 10 个存储库来处理包中数据的各个部分。对于依赖注入,我假设我只是注入了我想要的存储库,这将如何与外观一起工作?我需要多个立面,每个存储库一个吗?还是有别的办法?
    • 你能举例说明你的意思吗?如果没有太多上下文,恐怕很难回答。
    • 假设我有一个用于用户、帖子、产品、评论等的表格。我还有一个处理每个数据的存储库,因此用户存储库、帖子存储库等。我希望用户能够从门面访问这些存储库,-如何?不止一个门面?另一种方式?
    猜你喜欢
    • 2018-11-21
    • 2021-10-15
    • 2012-04-13
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    相关资源
    最近更新 更多