如何访问包的方法?

pan*_*hro 1 laravel laravel-5 laravel-5.3

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

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

我是否应该设置立面,以便他们可以执行以下操作:

SuperPackage::getSomeData();
Run Code Online (Sandbox Code Playgroud)

还是应该使用其他方式?

文档状态:

构建与Laravel交互的第三方程序包时,最好注入Laravel合同,而不要使用Facade。由于软件包是在Laravel本身之外构建的,因此您将无法使用Laravel的外观测试助手。

我想这只是为了包装的内部,是从外部调用包装,外墙还可以吗?

Jon*_*hon 5

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

您的合同:

namespace Your\Package;

public interface YourPackageContract
{
    public function availableMethod();
}
Run Code Online (Sandbox Code Playgroud)

您的实现:

namespace Your\Package;

class YourPackage implements YourContract
{
    public function availableMethod()
    {
        //  Implement your method
    }
}
Run Code Online (Sandbox Code Playgroud)

您的服务提供商:

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'];
    }
}
Run Code Online (Sandbox Code Playgroud)

您的门面:

namespace Your\Package\Facades;

use Illuminate\Support\Facades\Facade;

class YourPackage extends Facade
{
    public function getFacadeAccessor()
    {
        return 'Your\Package\YourPackageContract';
    }
}
Run Code Online (Sandbox Code Playgroud)

控制器中的用法:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

->alias()如果要创建访问类的多种方式(名称更具可读性等),则可以始终在服务提供商中使用该方法。

注意:我只是在这里直接写的,我还没有机会对其进行测试。