Задать вопрос
jumpordie
@jumpordie
Веб-разработчик, Череповец

Нормально ли обращаться к методам и свойствам классов через единый сервис?

Добрый день!
Есть класс сервиса, через который идет обращение к свойствам и методам других классов (моделей). Реализовано примерно так:
namespace App\Services;

use App\Models\City;
use App\Models\Country;
use App\Models\Hotel;
use App\Models\Region;

class Service
{
    private Country $country;
    private City $city;
    private Hotel $hotel;
    private Region $region

  /**
     * @param $name
     * @return City|Country|Hotel|Region
     * @throws \Exception
     */
    public function __get($name)
    {
        switch ($name) {
            case 'country':
                return new Country();
            case 'city':
                return new City();
            case 'hotel':
                return new Hotel();
            case 'region':
                return new Region();
            default:
                throw new \Exception('Property ' . $name . ' is not exist.');
        }
    }
}

Обращения происходят так:
$service = new Service();
$some = $service->city->someMethod();
$field_name = $service->country->field_name;

Вопрос в том, насколько разумен такой подход и м.б. есть какие-то подводные камни?
  • Вопрос задан
  • 216 просмотров
Подписаться 2 Средний 18 комментариев
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
С моей колокольни статических языков такая конструкция — избыточная сложность на пустом месте.
Но есть места, где такая сложность ещё и чем-то оправдана. Например, Qt — содержимое ячейки таблицы…
QVariant SomeModel::data(
    const QModelIndex &index, int role = Qt::DisplayRole) const override {}

Для чего оно такое в Qt…
• в самом начале функции может вычисляться адрес в памяти, где все эти данные находятся, а за ним — длинный switch/case «в зависимости от роли, возьми то-то»;
• возможно возвращение пустого QVariant, когда надо сказать: «действуй как обычно»;
• наконец, возможны сложные операции с данными, вроде преобразования в отображаемую форму и сортировки, которые не зависят от специфики модели данных.

Так что ответ. Смотрите по месту: что вы хотите этой конструкцией сказать и почему более простые не оправданы.
Ответ написан
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
поздравляю, ты открыл для себя шаблон проектирования фасад
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽