Как правильно вызвать нужный класс? Всем привет! Помогите понять как лучше всего вызвать нужный класс Я упрощу изложение вопроса до нескольких модулей на сайте... Допустим, на сайте есть модули: комментарий, посты, пользователи Для каждого модуля есть свой набор возможностей (лайк для комментариев и постов, подписка для пользователя и т.д.). Возьмем для примера только лайк Лайки у меня ставятся по принципу: тип объекта и его ID отсылается к единому файлу на сервере like.php. Значит ставя лайк для поста 333, файл like.php получает значение: type == post и id == 33 Далее, для каждого типа объекта есть свой классы, которые отвечают за генерацию объекта уведомления в БД. т.е. Устанавливая лайк посту 333, файл like.php должен создать объект класса LikePost и вызвать метод createNotify передавая в него нужные параметры. Вот как я это делаю сейчас:// это файл like.ph //........ switch($object_type) // проверяем тип объекта и вызываем метод создания уведомления нужного класс case 'post' /* * т.к. файл like.php знает только тип и ID объект * то уже внутри класса LikePost вызывается модель (в этом случае поста * и получаем ID автора поста, чтобы записать его вместе с уведомлением ка * получателя этого уведомлени * LikePost::createNotification($auth->user_id, $object_id) break case 'comment' // тот же смысл что при type == pos LikeComment::createNotification($auth->user_id, $object_id) break case 'news' // тот же смысл что при type == pos LikeNews::createNotification($auth->user_id, $object_id) break //..... и т.д
//........ У меня все получается, все работает, но код получается очень разбросанным, выходит что если на объект можно подписаться, поставить лайк, добавить комментарий, поделиться. То в каждом таком файле как like.php, мне нужно создавать такие проверки. И при добавлении на сайт какого-то нового типа объекта не забывать добавлять это все по каждому такому файлу, кроме того, изменяя название типа объекта, мне нужно будет в каждом тиком файле искать его и переименовывать На сколько я понимаю - это не правильный подход, но другого я придумать не могу, поэтому прошу объяснить, как на самом дела это все красиво делается?
Для упрощения и оптимизации вашего кода, вам стоит использовать паттерн проектирования "Фабричный метод" или "Фабрика".
Идея заключается в том, чтобы создать фабрику, которая будет отвечать за создание нужного объекта в зависимости от типа объекта. Таким образом, вам не нужно будет каждый раз добавлять проверки и вызывать методы конкретных классов в каждом файле.
Примерно это может выглядеть так:
Создайте интерфейс/абстрактный класс NotificationFactory, в котором будет метод createNotification($auth_user_id, $object_id).Создайте классы для каждого типа объекта (LikePost, LikeComment, LikeNews), которые будут реализовывать этот интерфейс/наследоваться от абстрактного класса.В самом файле like.php создайте переменную, которая будет хранить объект фабрики в зависимости от типа объекта.Вызывайте метод createNotification через эту переменную, передавая необходимые аргументы.
Пример реализации:
interface NotificationFactory public static function createNotification($auth_user_id, $object_id)
class LikePost implements NotificationFactory public static function createNotification($auth_user_id, $object_id) // Реализация создания уведомления для пост
class LikeComment implements NotificationFactory public static function createNotification($auth_user_id, $object_id) // Реализация создания уведомления для комментари
// В вашем файле like.ph switch($object_type) case 'post' $factory = new LikePost() $factory::createNotification($auth->user_id, $object_id) break case 'comment' $factory = new LikeComment() $factory::createNotification($auth->user_id, $object_id) break // Для других типов объектов создайте соответствующие классы и добавьте их обработку здес }
Таким образом, вы предотвратите дублирование кода, уменьшите его сложность и сделаете его более поддерживаемым и расширяемым.
Для упрощения и оптимизации вашего кода, вам стоит использовать паттерн проектирования "Фабричный метод" или "Фабрика".
Идея заключается в том, чтобы создать фабрику, которая будет отвечать за создание нужного объекта в зависимости от типа объекта. Таким образом, вам не нужно будет каждый раз добавлять проверки и вызывать методы конкретных классов в каждом файле.
Примерно это может выглядеть так:
Создайте интерфейс/абстрактный класс NotificationFactory, в котором будет метод createNotification($auth_user_id, $object_id).Создайте классы для каждого типа объекта (LikePost, LikeComment, LikeNews), которые будут реализовывать этот интерфейс/наследоваться от абстрактного класса.В самом файле like.php создайте переменную, которая будет хранить объект фабрики в зависимости от типа объекта.Вызывайте метод createNotification через эту переменную, передавая необходимые аргументы.Пример реализации:
interface NotificationFactorypublic static function createNotification($auth_user_id, $object_id)
class LikePost implements NotificationFactory
public static function createNotification($auth_user_id, $object_id)
// Реализация создания уведомления для пост
class LikeComment implements NotificationFactory
public static function createNotification($auth_user_id, $object_id)
// Реализация создания уведомления для комментари
// В вашем файле like.ph
switch($object_type)
case 'post'
$factory = new LikePost()
$factory::createNotification($auth->user_id, $object_id)
break
case 'comment'
$factory = new LikeComment()
$factory::createNotification($auth->user_id, $object_id)
break
// Для других типов объектов создайте соответствующие классы и добавьте их обработку здес
}
Таким образом, вы предотвратите дублирование кода, уменьшите его сложность и сделаете его более поддерживаемым и расширяемым.