Laravel:在一个对象实例上调用多个方法

时间:2014-08-08 08:13:31

标签: php oop laravel

我对laravel和oop来说相对较新,绝不是专家,所以我无法围绕一些涉及外墙的事情。

假设我正在构建一个与API交互的类,以便为我的电子商务订单创建新的发货标签。该类可以将数据发布到API以创建新的货件,并具有一些属性(发送到地址,我的客户的电子邮件跟踪和跟踪代码等...)和方法(创建新的货物,获得API返回的价格等...)。该类的名称将为Shipment。

在vanilla php我会做类似的事情:

$shipment = new shipment()
$shipment->create($data)
$price = $shipment->getPrice()

但在laravel我想使用外墙。因此,我创建了我的货件外观并注册了一个服务提供商,该服务提供商返回带有“货件”装订的新货件。现在我知道我是否

Shipment::create($data) 

laravel实际上会做

$app->['shipment']->create($data)

现在我的误会来了。如果我现在执行Shipment :: getPrice(),laravel会创建出货类的另一个实例,还是会使用在Shipment :: create()上创建的同一个实例?

我确实想继续使用第一个实例来访问货件对象属性(其中填充了从API返回的数据)而不是创建货运类的新实例,因为新类的属性会在没有先调用create方法的情况下仍然是空的!

我需要做吗

$shipment = Shipment::create() 

然后通过

访问getPrice方法
$shipment->getPrice() 

或者这是错误的做法,是否有更好的,更“laravel / OOP”的方式?

重新解释我的问题:如何通过facade / IoC绑定继续调用对象上的方法,而不在后续调用中创建新实例?反之亦然,如果我多次通过外观进行demoClass :: randomMethod,那么每次都会实现一个新的demoClass吗?

Thousend时间提前感谢!!

1 个答案:

答案 0 :(得分:0)

如果您使用外墙,您将始终获得相同的对象实例。

如果使用以下方法绑定您的课程:

App::bind('shipment', function()
    {
        return new \Shipment\Shipment;
    });

有门面:

use Illuminate\Support\Facades\Facade;

class Shipment extends Facade {

    protected static function getFacadeAccessor() { return 'shipment'; }

}

和你的班级:

namespace Shipment;

class Shipment {

    private $data;

    public function create($data) {
        $this->data[] = $data;
    }

    public function getPrice() {
        return implode(' ',$this->data);
    }
} 

你可以简单地运行:

Shipment::create('something');

Shipment::create('something2');

echo Shipment::getPrice();

你将得到输出

something something2

因为此类将数据保存在数组中并使您获得内爆数据。如您所见,您不需要创建任何额外的变量,因为您对同一个对象进行操作。