如何访问包方法?

时间:2016-11-24 10:37:46

标签: laravel laravel-5 laravel-5.3

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

当用户安装软件包时,如何让他们在应用程序中与存储库进行交互?

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

SuperPackage::getSomeData();

或者我应该采用不同的方式吗?

文档声明:

  

在构建与Laravel交互的第三方软件包时,它是   最好是注入Laravel合同而不是使用外墙。以来   包裹是在Laravel本身之外建造的,您将无法进入   到Laravel的门面测试助手。

我认为这只适用于包的内部,在外部调用包,外墙仍然可以吗?

1 个答案:

答案 0 :(得分:5)

由于您几乎不需要编写服务提供程序来将您的软件包集成到用户的应用程序中,我认为您应该通过使用合同的依赖注入来使您的软件包可用。我认为提供外观也不会让人感到痛苦,因为实际上它只是一个引用服务提供商内容的额外文件。

您的合同:

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()方法。

注意:我刚刚在这里写了这个,我没有机会测试它。