Использование оператора switch для добавления структуры URL-адреса

#php

#php

Вопрос:

Итак, у меня есть следующий оператор switch внутри метода внутри моего класса:

 public function getSASURL(string $blobName, string $size = '') : string
{
    if ($this->containerName === 'userpictures-resized') {
        switch ($size) {
            case 'small':
                return '_SThumb';
                break;
            case 'medium':
                return '_MThumb';
                break;
            case 'large':
                return '_LThumb';
                break;
            case 'original':
                return '_Original';
                break;
            case 'big':
                return '_Big';
                break;
        }
        return $this->generateSASURL($blobName . $size . '.jpg');
    }
    return $this->generateSASURL($blobName);
}
  

Вот что он делает:

Когда я вызываю:

 $sasURL = $azure->getSASURL('AHahn_com');
  

Я возвращаю следующую вещь — это работает так, как ожидалось.

 https://storageaccount.blob.core.windows.net/userpictures-resized/AHahn_com.jpg?sv=2017-11-09amp;sr=bamp;st=2020-10-08T13:04:47Z
  

Теперь, когда я вызываю:

 $sasURL = $azure->getSASURL('AHahn_com', 'small');
  

Я получаю следующее обратно:

 '_SThumb'
  

Вместо этого это результат, который я хочу получить обратно ( _SThumb после имени файла, перед расширением):

 https://storageaccount.blob.core.windows.net/userpictures-resized/AHahn_com_SThumb.jpg?sv=2017-11-09amp;sr=bamp;st=2020-10-08T13:04:47Z
  

Кто-нибудь знает, что я могу делать неправильно?

Комментарии:

1. Мы не можем помочь вам, не зная, как $this->containerName определяется / используется.

2. Вы return из функции в своем операторе switch, тогда как вы должны изменить $blobName .

3. Вы return в своем switch заявлении, так что в этом нет ничего неожиданного. Вместо этого вы должны изменить свою $size переменную, например $size = '_SThumb'; , вместо return '_SThumb';

4. Каждый case просто return представляет собой короткую строку. Это не проходит через $this->generateSASURL(...)

5. Спасибо за помощь @Qirel, это сработало!

Ответ №1:

Ваша проблема в том, что вы return из switch инструкции, а не используете значение для каждого случая. Вы можете либо перезаписать $size внутри каждого случая, например $size = '_SThumb'; , вместо return '_SThumb'; , либо создать другую переменную, которую вы заменяете $size своим generateSASURL() методом.

Однако другим подходом может быть создание карты размеров и их соответствующего значения. Затем просто получите доступ к массиву с $size помощью ключа. Чтобы сделать это без учета регистра, вы можете сделать $map[strtolower($size)] . Значение по умолчанию (когда совпадение не найдено) — это значение после оператора объединения с нулем ?? , которое может быть любым — вот оно $size , но это может быть пустая строка, если это более применимо.

 public function getSASURL(string $blobName, string $size = '') : string
{
    if ($this->containerName === 'userpictures-resized') {
        $map = [
            'size' => '_SThumb',
            'medium' => '_SThumb',
            'large' => '_MThumb',
            'original' => '_Original',
            'big' => '_Big',
        ];
        return $this->generateSASURL($blobName . ($map[$size] ?? $size) . '.jpg');
    }
    return $this->generateSASURL($blobName);
}