扩展composer包而不扩展每个类

时间:2017-08-01 09:16:43

标签: php laravel laravel-5 package composer-php

我正在创建我的第一个作曲家包。该软件包提供与现有软件包相同的功能,主要包含一些特定于我的软件包的附加功能。在我自己的类旁边,Vendor包中的所有类仍然需要可访问,但是来自我的包的命名空间。一些供应商类需要进行一些调整,但没有什么重要的。

让我们看一个简单的例子。供应商包中有一些类FooBar,它们位于名称空间Vendor\Package中。

<?php

namespace Vendor\Package;

class Foo // class needs adjustments/addition
{
   private $vendorVar;

   public function fooFunction() // function is fine as it is
   {
      return 'Vendor Foo output';
   }

   public function anotherFooFunction() // function should do some additional things
   {
      $this->vendorVar = 'Vendor!';
   }
}

<?php

namespace Vendor\Package;

class Bar // class is fine as it is
{
   public function barFunction() // function is fine as it is
   {
      return 'Vendor Bar output';
   }
}

由于我想为类Foo添加一些额外的功能并更改一次,我继承了这样的供应商:

<?php

namespace Me\MyPackage;

use Vendor\Package\Foo as vendorFoo;

class Foo extends vendorFoo 
{
   private $myVar;

   public function myFooFunction() // additional function to the Foo class
      {
      return 'My Foo output';
   }

   public function anotherFooFunction() // change the functionality for this function
   {
      $this->myVar = 'Me!';
      parent::anotherFooFunction();
   }
}

现在我可以执行以下操作:

<?php

use Me\MyPackage\Foo;

$foo = new Foo();

echo $foo->myFooFunction(); // output: 'My Foo output'
echo $foo->fooFunction(); // output: 'Vendor Foo output'
$foo->anotherFooFunction; // will set $vendorVar and $myVar

由于我不希望用户需要知道Vendor包,我希望他们可以访问Vendor包的所有其他功能,但是可以访问我自己的命名空间。基本上他们需要能够做类似

的事情
<?php

use Me\MyPackage\Bar;

$bar = new Bar();

echo $bar->barFunction(); // output: 'Vendor Bar output'

我假设我可以在我的包中添加以下代码。

<?php

namespace Me\MyPackage;

use Vendor\Package\Bar as vendorBar;

class Bar extends vendorBar {} // Do I have to add this for each class I want to use from my namespace?

当Vendor包有很多类而且我只想触摸一个时,这对我来说似乎有些过分。这是唯一/最好的方式,还是有其他/更好的方式?

其他信息:

  • 我正在使用Laravel框架,但我认为这不应该太重要。
  • 分叉看起来不是一个好主意。例如,当进行供应商包中的小的改变时,例如,一个安全修复程序,我将不得不重写我的代码。我将假设Vendor包的类结构不会很快改变。
  • 这将是原始供应商包的扩展,因此添加拉取请求是不合适的。
  • 我尝试使用一个简单的例子,但对于那些感兴趣的人,我想扩展laravel \ passport包。这个问题是以下问题的后续问题:Add or adjust functionality of installed packages
  • 其他问题,主要包裹如何解决这个问题?例如,Laravel如何在整个框架中使用Symphony功能?

0 个答案:

没有答案