我对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时间提前感谢!!
答案 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
因为此类将数据保存在数组中并使您获得内爆数据。如您所见,您不需要创建任何额外的变量,因为您对同一个对象进行操作。