扩展laravel供应商套餐的最佳方式是什么?
1 - 将包复制到我自己的应用程序/包并更改它?
2 - 使用服务提供商扩展课程?
3 - 还是其他什么?
答案 0 :(得分:1)
没有最佳方法,但option - 1
不是选择,根本不是,至少对于扩展组件/类。
无论如何,Laravel框架提供了扩展自己的包的不同方法。例如,框架有几个Manager classes
来管理基于驱动程序的组件的创建。其中包括the cache
,session
,authentication
和queue
个组件。 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
],
可能有另一种方法可以达到相同的效果,但这很简单。