扩展Laravel包根类而不扩展扩展类

k4emjkb1  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(135)

我正在处理一个包,其中类('A','B'和'C')扩展了“根”类'Foo'。

class Foo {
    public function abc(){
        //
    }
}

class A extends Foo {
    ...
    $this->abc();
    ...
}

class B extends Foo {
    ...
    $this->abc();
    ...
}

class C extends Foo {
    ...
    $this->abc();
    ...
}

在实现此包的项目中,它需要覆盖类'Foo'中的方法'abc'。
PHP/Laravel的正确方法是什么?
有没有一种方法可以扩展/覆盖一个包类,比如一个视图可以使用vendor文件夹?如果可能的话,这将是一个有趣的选择。

更新

以正确的Angular 看待情况的复杂性。类'A'、'B'和'C'在包中的多个位置被调用。我不能只是在应用程序中扩展类'A',因为我需要重新定义对包中类A的所有调用的命名空间路径。
我正在考虑为包中的“A”、“B”和“C”类创建一个门面。这样我就可以覆盖AppServiceProvider包中的facade路径。但我觉得这种做法有点“肮脏”。因此,有理由寻求更清晰的实施建议。

jv2fixgn

jv2fixgn1#

找到一个解决方法。
扩展abc方法的需要是基于应用程序的特定参数在类Foo(一个Mailable对象)中设置from属性。我需要为所有发送的邮件设置此属性。

public function abc(){
    $this->from(getSender());
}

因为我在包中使用了一个helper函数bar来调用各种类(A,B & C)。

bar(new A)
...
bar(new B)
...
bar(new C)

解决方法之前的包帮助程序文件中的函数

function bar(\Foo $mailableObject) {
    ...
    Mail::send(mailableObject);
}

我创建了一个“钩子”,方法是在函数bar中添加对可选函数的调用。如果在集成包的应用程序中声明,它将允许在类Foo上执行所需的操作。

function bar(\Foo $mailableObject) {
    ...
    if (function_exists('optionalFunction' {
        Mail::send(optionalFunction(mailableObject));
    } else {
        Mail::send(mailableObject);
    }
}

在应用程序帮助程序文件中

function optionalFunction(\Foo $mailableObject) {
    // Provided the 'from' method is public
    $mailableObject->from(getSender());
    return $mailableObject;
}

function getSender() {
    if(condition123()){
        return 'aaaa@mail.com';
    } else {
        return 'bbbb@mail.com';
}

希望能帮助到处于类似境地的人。

esyap4oy

esyap4oy2#

更新

对于这个特殊的情况下,我需要改变从nameemail的所有电子邮件正在发送,有一个更容易的解决方案。感谢Laracast post
我所要做的就是覆盖AppServiceProvider中的配置值。

public function boot() {
    ...
    if(condition123()){
        config(['mail.from.address' => 'aaaa@mail.com']);
    } else {
        config(['mail.from.address' => 'bbbb@mail.com']);
}

相关问题