我正在将Stripe API与CMS集成。我需要将查询中的_values
属性作为数组返回,以便数据在CMS中作为模板变量可用,但它始终受到保护。
我一直在使用Reflection类来获取数据,但现在我使用的是Stripe的'Stripe'Plan::all();
,我必须多次调用我为处理Reflection类别而编写的快捷方式方法。不过,它并不完全是递归的,因为我必须根据从Stripe API调用的方法来不同地处理它。
有没有一种方法可以真正递归地使用反射类?还有什么比我不知道的Reflection类更合适的吗?
以下是'Stripe'Plan::all();
:的var_dump()
ed响应示例
object(Stripe'Collection)#604 (5) {
["_opts":protected]=>
object(Stripe'Util'RequestOptions)#603 (2) {
["headers"]=>
array(0) {
}
["apiKey"]=>
string(32) "XXXXXXXXXXXXXXXX"
}
["_values":protected]=>
array(4) {
["object"]=>
string(4) "list"
["has_more"]=>
bool(false)
["url"]=>
string(9) "/v1/plans"
["data"]=>
array(2) {
[0]=>
object(Stripe'Plan)#605 (5) {
["_opts":protected]=>
object(Stripe'Util'RequestOptions)#603 (2) {
["headers"]=>
array(0) {
}
["apiKey"]=>
string(32) "XXXXXXXXXXXXXXXX"
}
["_values":protected]=>
array(12) {
["id"]=>
string(8) "my_plan"
["interval"]=>
string(5) "month"
["name"]=>
string(9) "My Plan"
["created"]=>
int(1427441577)
["amount"]=>
int(20000)
["currency"]=>
string(3) "usd"
["object"]=>
string(4) "plan"
["livemode"]=>
bool(false)
["interval_count"]=>
int(1)
["trial_period_days"]=>
NULL
["metadata"]=>
object(Stripe'AttachedObject)#608 (5) {
["_opts":protected]=>
object(Stripe'Util'RequestOptions)#603 (2) {
["headers"]=>
array(0) {
}
["apiKey"]=>
string(32) "XXXXXXXXXXXXXXXX"
}
["_values":protected]=>
array(0) {
}
["_unsavedValues":protected]=>
object(Stripe'Util'Set)#612 (1) {
["_elts":"Stripe'Util'Set":private]=>
array(0) {
}
}
["_transientValues":protected]=>
object(Stripe'Util'Set)#613 (1) {
["_elts":"Stripe'Util'Set":private]=>
array(0) {
}
}
["_retrieveOptions":protected]=>
array(0) {
}
}
["statement_descriptor"]=>
NULL
}
["_unsavedValues":protected]=>
object(Stripe'Util'Set)#609 (1) {
["_elts":"Stripe'Util'Set":private]=>
array(0) {
}
}
["_transientValues":protected]=>
object(Stripe'Util'Set)#610 (1) {
["_elts":"Stripe'Util'Set":private]=>
array(0) {
}
}
["_retrieveOptions":protected]=>
array(0) {
}
}
[1]=>
object(Stripe'Plan)#611 (5) {
["_opts":protected]=>
object(Stripe'Util'RequestOptions)#603 (2) {
["headers"]=>
array(0) {
}
["apiKey"]=>
string(32) "XXXXXXXXXXXXXXXX"
}
["_values":protected]=>
array(12) {
["id"]=>
string(9) "some_other_plan"
["interval"]=>
string(5) "month"
["name"]=>
string(14) "Some Other Plan"
["created"]=>
int(1427431129)
["amount"]=>
int(40000)
["currency"]=>
string(3) "usd"
["object"]=>
string(4) "plan"
["livemode"]=>
bool(false)
["interval_count"]=>
int(1)
["trial_period_days"]=>
NULL
["metadata"]=>
object(Stripe'AttachedObject)#614 (5) {
["_opts":protected]=>
object(Stripe'Util'RequestOptions)#603 (2) {
["headers"]=>
array(0) {
}
["apiKey"]=>
string(32) "XXXXXXXXXXXXXXXX"
}
["_values":protected]=>
array(0) {
}
["_unsavedValues":protected]=>
object(Stripe'Util'Set)#618 (1) {
["_elts":"Stripe'Util'Set":private]=>
array(0) {
}
}
["_transientValues":protected]=>
object(Stripe'Util'Set)#619 (1) {
["_elts":"Stripe'Util'Set":private]=>
array(0) {
}
}
["_retrieveOptions":protected]=>
array(0) {
}
}
["statement_descriptor"]=>
NULL
}
["_unsavedValues":protected]=>
object(Stripe'Util'Set)#615 (1) {
["_elts":"Stripe'Util'Set":private]=>
array(0) {
}
}
["_transientValues":protected]=>
object(Stripe'Util'Set)#616 (1) {
["_elts":"Stripe'Util'Set":private]=>
array(0) {
}
}
["_retrieveOptions":protected]=>
array(0) {
}
}
}
}
["_unsavedValues":protected]=>
object(Stripe'Util'Set)#606 (1) {
["_elts":"Stripe'Util'Set":private]=>
array(0) {
}
}
["_transientValues":protected]=>
object(Stripe'Util'Set)#607 (1) {
["_elts":"Stripe'Util'Set":private]=>
array(0) {
}
}
["_retrieveOptions":protected]=>
array(0) {
}
}
您不必使用Reflection API,Stripe'Collection
类实现了ArrayAccess,您可以直接迭代它:
$collection = 'Stripe'Plan::all();
foreach ($collection as $plan) {
// Do something with the plan
}
这是Collection
类扩展的基类。Stripe的PHP库中几乎所有的类都是如此,包括Stripe'Plan
。因此,您可以使用普通数组中使用的任何类型的递归。
如果要将_values
属性作为数组返回,可以使用__toArray()
方法:
$array = $collection->__toArray(true);
true
参数是一个递归选项。
要添加到Victor Stanciu的答案中,如果您只想访问_values
数组的某些元素,则可以使用动态属性。
例如,如果你想访问数据,你可以这样做:
$collection = 'Stripe'Plan::all();
$plans = $collection->data;
然后,类似地,您可以从每个计划中检索任何数组元素:
foreach ($plans as $plan) {
print $plan->name;
}
我将此代码用于Stripe API版本3。