所以我想到了以下代码:
public function duplicateSelectedAd($request)
{
$setData = [];
$newAd = $request[0];
foreach($newAd as $key=>$value) {
if(property_exists(AdFields::class, strtoupper($key))){
$setData[AdFields::strtoupper($key)] = array_get($request[0], $value);
}
}
$ad = new Ad(null, 'act_'.$newAd['account_id']);
$ad->setData($setData)->create();
}
它检查返回数组的所有索引,并应将它们复制到新广告中。全部通过facebook API。这是addsfield类:
class AdFields extends AbstractEnum {
const ACCOUNT_ID = 'account_id';
const AD_REVIEW_FEEDBACK = 'ad_review_feedback';
const ADLABELS = 'adlabels';
const ADSET = 'adset';
const ADSET_ID = 'adset_id';
const BID_AMOUNT = 'bid_amount';
const BID_INFO = 'bid_info';
const BID_TYPE = 'bid_type';
const CAMPAIGN = 'campaign';
const CAMPAIGN_ID = 'campaign_id';
const CONFIGURED_STATUS = 'configured_status';
const CONVERSION_SPECS = 'conversion_specs';
const CREATED_TIME = 'created_time';
const CREATIVE = 'creative';
const EFFECTIVE_STATUS = 'effective_status';
const ID = 'id';
const LAST_UPDATED_BY_APP_ID = 'last_updated_by_app_id';
const NAME = 'name';
const RECOMMENDATIONS = 'recommendations';
const SOURCE_AD = 'source_ad';
const SOURCE_AD_ID = 'source_ad_id';
const STATUS = 'status';
const TRACKING_SPECS = 'tracking_specs';
const UPDATED_TIME = 'updated_time';
const ADSET_SPEC = 'adset_spec';
const DATE_FORMAT = 'date_format';
const DISPLAY_SEQUENCE = 'display_sequence';
const EXECUTION_OPTIONS = 'execution_options';
const FILENAME = 'filename';
public function getFieldTypes() {
return array(
'account_id' => 'string',
'ad_review_feedback' => 'AdgroupReviewFeedback',
'adlabels' => 'list<AdLabel>',
'adset' => 'AdSet',
'adset_id' => 'string',
'bid_amount' => 'int',
'bid_info' => 'map<string, unsigned int>',
'bid_type' => 'BidType',
'campaign' => 'Campaign',
'campaign_id' => 'string',
'configured_status' => 'ConfiguredStatus',
'conversion_specs' => 'list<ConversionActionQuery>',
'created_time' => 'datetime',
'creative' => 'AdCreative',
'effective_status' => 'EffectiveStatus',
'id' => 'string',
'last_updated_by_app_id' => 'string',
'name' => 'string',
'recommendations' => 'list<AdRecommendation>',
'source_ad' => 'Ad',
'source_ad_id' => 'string',
'status' => 'Status',
'tracking_specs' => 'list<ConversionActionQuery>',
'updated_time' => 'datetime',
'adset_spec' => 'AdSet',
'date_format' => 'string',
'display_sequence' => 'unsigned int',
'execution_options' => 'list<ExecutionOptions>',
'filename' => 'file',
);
}
}
如果我在循环之前返回$ newAd,我将获得所有具有值或null的adfields选项,所以我知道我将其引入了。我只是不知道为什么它没有达到if语句。任何意见,将不胜感激。
答案 0 :(得分:1)
似乎有点脏,但是您可以将类和常量名称连接为已定义的参数,以检查其是否存在:
$constant = AdFields::class . '::' . strtoupper($key);
defined($constant);
AdFields::strtoupper($key)
将无法正常工作。这将尝试在AdFields类上调用名为strtoupper的静态方法。检索动态常量时,您需要对相同的串联字符串使用常量方法:
constant($constant)