【问题标题】:Check if parameter equals defined constant from model检查参数是否等于模型中定义的常量
【发布时间】:2019-10-03 12:01:55
【问题描述】:

在我的 MeetingType 模型中,我有这个常量:

const EXAMPLE_SHAREHOLDERS_MEETING =
[
    'Shareholders meeting',
    'Management meeting',
    'General meeting',
    'Start meeting'
];

在我的控制器中,我从我的模型中调用一个函数,如下所示:

$topics = MeetingType::get_meeting_type_topics($meetingTypeName);

其中$meetingTypeName 等于“股东大会”。

如果传递的参数与我的常量数组匹配,我如何签入我的函数/开关?这就是我说的函数:

/**
 * Define and return MeetingType Topics. 
 *
 * @param string $meetingTypeName
 * @return array
 */
public static function get_meeting_type_topics($meetingTypeName)
{
    switch (MeetingType::EXAMPLE_SHAREHOLDERS_MEETING) {
        case 'Shareholders meeting':
            $topics = [
                'Opening',
            ];
            break;
        case 'Management meeting':
            $topics = [
                'Aanwezigen / afwezigen',
            ];
            break;
        case 'General meeting':
            $topics = [
                'Opening',
            ];
            break;
        case 'Start meeting':
            $topics = [
                "Uitleg van deze vergadering",
            ];
            break;
    }

    return $topics;
}

【问题讨论】:

  • in_array($meetingTypeName,MeetingType::EXAMPLE_SHAREHOLDERS_MEETING)。它会返回真或假

标签: php laravel function switch-statement constants


【解决方案1】:

您可以将const EXAMPLE_SHAREHOLDERS_MEETING 重新定义为

const EXAMPLE_SHAREHOLDERS_MEETING =
[
    'Shareholders meeting' => 'Opening',
    'Management meeting' => 'Aanwezigen / afwezigen',
    'General meeting' => 'Opening',
    'Start meeting' => "Uitleg van deze vergadering",
];

在你的函数中返回类似:

public static function get_meeting_type_topics($meetingTypeName)
{
    return MeetingType::EXAMPLE_SHAREHOLDERS_MEETING[$meetingTypeName];
}

【讨论】:

  • 在特定情况下这是一个解决方案,但它肯定不是一个干净的解决方案。您在这里混合了常量,这应该使逻辑开关与翻译保持一致。
【解决方案2】:

我会去

class MeetingEntity {
// ...
  const SHAREHOLDERS_MEETING = 0;
  const MANAGEMENT_MEETING = 1;
  const GENERAL_MEETING = 2;
  const START_MEETING = 3;

  const MEETINGS_TYPES =
  [
    0 => self::SHAREHOLDERS_MEETING,
    1 => self::MANAGEMENT_MEETING,
    2 => self::GENERAL_MEETING,
    3 => self::START_MEETING,
  ];
// ...

由于我有点习惯这种模式的原因。特别是在键不是数字而是单词的情况下,它非常有用。

你可以用一些简单的东西来使用开关:

switch($aMeetingType) {
    case MeetingEntity::SHAREHOLDERS_MEETING:
      // ....
      break;

或者更安全一点:

if (array_key_exists($aMeetingType, MeetingEntity::MEETING_TYPES)) {
    switch(MeetingEntity::MEETING_TYPES[$aMeetingType]) {
        case MeetingEntity::SHAREHOLDERS_MEETING:
            // ...
            break;
    }
} else { // throw

【讨论】:

    【解决方案3】:

    我更喜欢@u_mulder 的方法。但这里有一些改进:

    public static function get_meeting_type_topics($meetingTypeName)
    {
        if (!array_key_exists($meeetingName, MeetingType::EXAMPLE_SHAREHOLDERS_MEETING)) {
            return 'Not handled meeting';
        }
        return MeetingType::EXAMPLE_SHAREHOLDERS_MEETING[$meetingTypeName];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      • 2012-04-27
      • 2017-12-25
      • 2020-01-05
      相关资源
      最近更新 更多