首页 > 解决方案 > property_exists 方法没有命中

问题描述

所以我想出了这个代码:

    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 实现的。这是添加字段类:

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 语句。任何意见,将不胜感激。

标签: phplaravelfacebookapi

解决方案


看起来有点脏,但是您可以将类和常量名称连接为定义的参数来检查它是否存在:

$constant = AdFields::class . '::' . strtoupper($key);
defined($constant);

AdFields::strtoupper($key)不会像你期望的那样工作。这将尝试在 AdFields 类上调用名为 strtoupper 的静态方法。检索动态常量时,您需要使用具有相同连接字符串的常量方法:

constant($constant)

推荐阅读