扩展Laravel Vendor包的最佳方式?

时间:2016-02-12 17:02:57

标签: php laravel

扩展laravel供应商套餐的最佳方式是什么?

1 - 将包复制到我自己的应用程序/包并更改它?

2 - 使用服务提供商扩展课程?

3 - 还是其他什么?

3 个答案:

答案 0 :(得分:1)

没有最佳方法,但option - 1不是选择,根本不是,至少对于扩展组件/类。

无论如何,Laravel框架提供了扩展自己的包的不同方法。例如,框架有几个Manager classes来管理基于驱动程序的组件的创建。其中包括the cachesessionauthenticationqueue个组件。 manager类负责根据应用程序的配置创建特定的驱动程序实现。

这些管理器中的每一个都包含一个extend方法,可以用来轻松地将新的驱动程序解析功能注入到manager中。在这种情况下,你可以扩展cache,例如,使用以下内容:

Cache::extend('mongo', function($app)
{
    return Cache::repository(new MongoStore);
});

但这不仅仅是使用管理器扩展组件的方法。就像你提到的Service Provider一样,是的,这是扩展组件的另一种选择。在这种情况下,您可以扩展组件的服务提供者类并交换提供者数组。有关Laravel网站的专门章节,请查看the documentation

答案 1 :(得分:0)

供应商文件通常是命名空间。您自己的包/代码也将/应该是命名空间。使用这个,我会创建自己的包,依赖于其他Vendor的包,然后创建我自己的类,扩展它们。

<?php namespace My\Namespace\Models
class MyClass extends \Vendor3\Package\VendorClass {
  // my custom code that enhances the vendor class
}

您永远不应该考虑更改供应商的软件包。虽然可以做到这一点,但是防止这些变化消失的维护要求变得繁重。 (即供应商更新他们的包裹,您的更改风险消失)。将供应商数据作为基础进行处理,然后在其基础上进行构建,而不是修改基础,实际上使您的代码更易于维护和使用。 IMO。

答案 2 :(得分:0)

您可以根据需要扩展或自定义服务提供商,然后在您的应用配置中注册它们。例如,我最近需要创建自己的密码重置服务提供程序。

首先,我在 / app / Auth / Passwords /

中创建了我的2个自定义文件

PasswordResetServiceProvider.php

namespace App\Auth\Passwords;

use App\Auth\Passwords\PasswordBroker;
use Illuminate\Auth\Passwords\PasswordResetServiceProvider as BasePasswordResetServiceProvider;

class PasswordResetServiceProvider extends BasePasswordResetServiceProvider 
{
    protected function registerPasswordBroker()
    {
        // my custom code here
        return new PasswordBroker($custom_things);
    }
}

PasswordBroker.php

namespace App\Auth\Passwords;

use Closure;
use Illuminate\Auth\Passwords\PasswordBroker as BasePasswordBroker;

class PasswordBroker extends BasePasswordBroker
{
    public function sendResetLink(array $credentials, Closure $callback = null) {
        // my custom code here    
        return \Illuminate\Contracts\Auth\PasswordBroker::RESET_LINK_SENT;
    }

    public function emailResetLink(\Illuminate\Contracts\Auth\CanResetPassword $user, $token, Closure $callback = null) {
        // my custom code here
        return $this->mailer->queue($custom_things);
    }

}

现在我有自定义类,我替换了 /config/app.php

中的默认服务提供程序
'providers' => [
    // a bunch of service providers

    // Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
    App\Auth\Passwords\PasswordResetServiceProvider::class, //custom

    // the remaining service providers
],

可能有另一种方法可以达到相同的效果,但这很简单。