Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6

Событие или простой класс

07.10.2018, 17:40. Показов 1057. Ответов 13

Студворк — интернет-сервис помощи студентам
Добрый вечер коллеги!

Хотелось бы узнать, как использовать события или использовать ли их в моем проекте или вообще не использовать.

В своём проекте стараюсь соблюдать общепринятые правила

Одно из правил, не нагромождать метод кодом
Если есть возможность один и тот же код использовать повторно.

И прочее.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
     *
     * @throws ExceptionCMS
     */
    public function registrationData ()
    {
        extract($this->request->post);
 
        settype($customer_email,                'string');
        settype($customer_phone,                'string');
        settype($customer_first_name,           'string');
        settype($customer_last_name,            'string');
        settype($customer_password,             'string');
        settype($customer_password_confirm,     'string');
 
        if ($customer_password != $customer_password_confirm) {
            throw new ExceptionCMS('title','message','error',-1);
        }
 
        try{
            $this->registration->add([
                    'customer_email' => $customer_email,
                    'customer_phone' => $customer_phone,
                    'customer_first_name' => $customer_first_name,
                    'customer_last_name' => $customer_last_name,
                    'customer_password' => md5($customer_password)
                ]
            );
        }catch (Exception $e){
            switch ($this->db->getErrNo()){
                case 1062: throw new ExceptionCMS('Внимание!','Пользователь уже существует!','error',-1);
                default: throw new ExceptionCMS('Ошибка','Неизвестная ошибка','error',-1);
            }
        }
 
    }
С исключениями все в порядке, в одном месте генерирую ответ ошибки в формате JSON.

Вопрос, а в случае успеха??? надоело в каждом методе отдавать что то типа

$msg = [];
$msg['errorCode'] = 0;
$msg['msgType'] = 'success';
$msg['msgTitle'] = 'Успех';
$msg['msg'] = 'Вы молодец';
echo json_encode($msgExcept, JSON_UNESCAPED_UNICODE);

Как мне кажется, правильнее раз определить метод в отдельном классе и подключить через сервисы или по аналогии исключений или статический метод класса.

Message::msg('Успех!', 'День удался!', 'success', 0);


Как вы решаете данный вопрос в своих проектах.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.10.2018, 17:40
Ответы с готовыми решениями:

Класс: простой класс юнитов из эпохи
Хай, всем. Вот я создал простой класс юнитов из эпохи, проанализируйте его, пожалуйста. Может как его лучше надо было написать с точки...

Класс для безопасной и простой работы с mysqli
Зачем нужна обертка над СУБД написано тут - http://habrahabr.ru/post/148701/ Там же подробно описано, почему PDO или mysqli нужно...

Простой php класс который преобразовывает число в строковой еквивалент
Например число 2355 в two thousands three hundreds fifty five. Диапазон чисел от нуля до одного миллиарда, язык строкового представления...

13
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
07.10.2018, 17:57
Зачем вообще всё это? Достаточно только "Вы молодец". Title, Type -- это часть view, зачем её тут задавать?
errorCode заменить HTTP-кодом можно.
0
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
07.10.2018, 18:33  [ТС]
Цитата Сообщение от Para bellum Посмотреть сообщение
Зачем вообще всё это? Достаточно только "Вы молодец". Title, Type -- это часть view, зачем её тут задавать?
errorCode заменить HTTP-кодом можно.
Проект мультиязычный.
И ошибки возвращаются с переводом.
И не только ошибки, еще информационные сообщения и прочие мессаги.

Некоторые методы просто возвращают JSON
Вот так:
JSON
1
2
3
4
5
6
{
    "errorCode": -1,
    "msgType": "error",
    "msgTitle": "Внимание!",
    "msg": "Пользователь уже существует!"
}
Соответственно, метод, который занимается формированием json объекта, который описан выше.
Можно определить один раз и вызывать через функцию, минимизировать дубликаты.

Добавлено через 1 минуту
Para bellum, Вы наверное не поняли что я имел в виду, возможно я не верно задал вопрос.

Добавлено через 8 минут
Наверное вот что я имел в виду.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
 
namespace Engine\Helper;
 
 
 class Message
{
 
     /**
      * @param        $title
      * @param        $message
      * @param string $type
      * @param int    $code
      */
     public static function msg($title, $message, $type = 'success', $code = 0)
    {
        echo json_encode((object)
        [
            'errorCode' => $code,
            'msgType'   => $type,
            'msgTitle'  => $title,
            'msg'       => $message
        ],
            JSON_UNESCAPED_UNICODE);
    }
}
Добавлено через 3 минуты
В итоге, выглядит так:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
    /**
     *
     * @throws ExceptionCMS
     */
    public function registrationData ()
    {
        extract($this->request->post);
 
        settype($customer_email,                'string');
        settype($customer_phone,                'string');
        settype($customer_first_name,           'string');
        settype($customer_last_name,            'string');
        settype($customer_password,             'string');
        settype($customer_password_confirm,     'string');
 
        if ($customer_password != $customer_password_confirm) {
            throw new ExceptionCMS('','','',-1);
        }
 
        try{
            $this->registration->add([
                    'customer_email' => $customer_email,
                    'customer_phone' => $customer_phone,
                    'customer_first_name' => $customer_first_name,
                    'customer_last_name' => $customer_last_name,
                    'customer_password' => md5($customer_password)
                ]
            );
 
            Message::msg(
                'Успех!',
                'Вы успешно зарегистрированы!',
                'success'
            );
 
 
        }catch (Exception $e){
            switch ($this->db->getErrNo()){
                case 1062: throw new ExceptionCMS('Внимание!','Пользователь уже существует!','error',-1);
                default: throw new ExceptionCMS('Ошибка','Неизвестная ошибка','error',-1);
            }
        }
    }
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
07.10.2018, 20:25
popryduhin, в целом все правильно, но Message::msg как то странно выглядит.

У меня так.
PHP
1
return responder()->success(['users' => $users]);
Использую этот пакет, он только для ларавела, но логика очевидна.

А события тут как-то вообще ни к селу ни к городу.


PHP
1
2
throw new ExceptionCMS('','','',-1);
throw new ExceptionCMS('Внимание!','Пользователь уже существует!','error',-1)
Весело. Не думаю что эксепшены должны использоваться так.
0
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
07.10.2018, 21:46  [ТС]
tarasalk, Как я выше озвучил, с эксепшенами все в порядке.

а с чем связанна странность с Message::msg?

С названием или похоже на костыль?
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
07.10.2018, 23:02
Цитата Сообщение от popryduhin Посмотреть сообщение
С названием или похоже на костыль?
И то и другое.
1) Назначение не очевидно.
2) Нет return.
3) Сам себя рендерит. Лучше возвращать объект response и пусть кто-то другой его рендерит.
4) Не завершает работу.
5) $type - строка, лучше константа. А еще лучше разные методы.
6) Не люблю статику.

Конечно все это имхо, как и коммент про эксепшены. Если вам удобно, почему бы и нет.
1
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
07.10.2018, 23:36  [ТС]
tarasalk, учту замечания.

На счет рендера вы правы.

Добавлено через 15 минут
Цитата Сообщение от tarasalk Посмотреть сообщение
4) Не завершает работу.
Вот тут не понял, как завершать работу, return?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
08.10.2018, 06:37
Цитата Сообщение от popryduhin Посмотреть сообщение
Проект мультиязычный.
И ошибки возвращаются с переводом.
И не только ошибки, еще информационные сообщения и прочие мессаги.
Разницы нет. Возврат текста ошибки делаете правильно, а вот заголовки типа "Успех" -- это задачи вида.
Например, у Вас 20 методов, обрабатывающих POST/PUT запросы и в каждом из них будете писать один и тот же "Успех"?

Не проще написать один шаблон с alert, который будет либо ошибки выводить, с заголовком "Ошибка" или сообщение об успехе с заголовком "Успех"?
Цитата Сообщение от popryduhin Посмотреть сообщение
Вы наверное не поняли что я имел в виду, возможно я не верно задал вопрос.
Да нет, я понял. Просто сказал к тому, что, если следовать логике, что я описал, ваш код сократился бы до такого:
PHP
1
echo json_encode(['status' => 'Вы молодец'], JSON_UNESCAPED_UNICODE);
Одна строка, как видите.

Лучше, конечно, использовать что-то более продвинутое, чем просто echo использовать.
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
08.10.2018, 09:23
Цитата Сообщение от popryduhin Посмотреть сообщение
Вот тут не понял, как завершать работу, return?
return / exit. То, что гарантирует прекращение работы. Обычно вывод сообщения, это самая последняя операция.
1
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
08.10.2018, 16:03  [ТС]
tarasalk, ок, я понял, это же очевидно.

Спасибо.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
08.10.2018, 21:34

Не по теме:

Цитата Сообщение от tarasalk Посмотреть сообщение
6) Не люблю статику.
Цитата Сообщение от tarasalk Посмотреть сообщение
PHP
1
return responder()->success(['users' => $users]);

0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
08.10.2018, 22:00
Jewbacabra, что не так?
0
08.10.2018, 22:26

Не по теме:

Цитата Сообщение от tarasalk Посмотреть сообщение
что не так?
Функция это фактически и есть статика

0
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
08.10.2018, 23:46  [ТС]
Если продолжить тему.


Например, у нас есть класс Message, который будет заниматься тем, что будет рендерить сообщения в формате JSON


Вариант номер 1

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
 
namespace Engine\Helper;
 
 
 class Message
{
 
     /**
      * @param        $title
      * @param        $message
      * @param int    $code
      * @return string
      */
     public static function success($title, $message, $code = 0)
    {
        return json_encode((object)
        [
            'errorCode' => $code,
            'msgType'   => 'success',
            'msgTitle'  => $title,
            'msg'       => $message
        ],
            JSON_UNESCAPED_UNICODE);
    }
 
 
 
     /**
      * @param $title
      * @param $message
      * @param int $code
      * @return string
      */
     public static function info($title, $message, $code = 0)
     {
         return json_encode((object)
         [
             'errorCode' => $code,
             'msgType'   => 'info',
             'msgTitle'  => $title,
             'msg'       => $message
         ],
             JSON_UNESCAPED_UNICODE);
     }
}
Использовать так:

PHP
1
2
3
   header("Content-type: application/json; charset=utf-8");
   echo Message::success('Успех!', 'Вы успешно зарегистрированы!', 'success');
   exit;


Вариант номер 2

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
 
namespace Engine\Helper;
 
 
 class Message
{
 
     /**
      * @param        $title
      * @param        $message
      * @param int    $code
      * @return string
      */
     public static function success($title, $message, $code = 0)
    {
        header("Content-type: application/json; charset=utf-8");
        echo json_encode((object)
        [
            'errorCode' => $code,
            'msgType'   => 'success',
            'msgTitle'  => $title,
            'msg'       => $message
        ],
            JSON_UNESCAPED_UNICODE);
        exit;
    }
 
 
 
     /**
      * @param $title
      * @param $message
      * @param int $code
      * @return string
      */
     public static function info($title, $message, $code = 0)
     {
        header("Content-type: application/json; charset=utf-8");
        echo json_encode((object)
        [
            'errorCode' => $code,
            'msgType'   => 'success',
            'msgTitle'  => $title,
            'msg'       => $message
        ],
            JSON_UNESCAPED_UNICODE);
        exit;
     }
}
Использовать так:

PHP
1
2
   
   Message::success('Успех!', 'Вы успешно зарегистрированы!', 'success');
Добавлено через 1 минуту
В каком случае будет правильней?

Как с профессиональной точки зрения, так и с религиозной.

Или какой то еще, неведомый вариант.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.10.2018, 23:46
Помогаю со студенческими работами здесь

Что лучше новый класс или событие?
Объясните непонятливому программисту: какое преимущество в использовании события, созданного самим программистом, ведь намного удобнее...

Класс: Как обработать событие последнего объекта в форме, не создавая в классе объекта промежуточное событие?
Итак! Проблема состоит в следующем! Имеется класс в который входит объект второго класса. В последнем классе имеется событие. Как правильно...

Можно ли как то запустить функцию или класс которая находится ниже чем исполняемая функция или класс?
Можно ли как то запустить функцию или класс которая находится ниже чем исполняемая функция или класс?

Подписка на событие, простой пример
Привет всем. Вобщем хочу сделать винформу в WPF. Нужно чтобы в label постоянно писалось значение long из функции. Писаться значение...

Событие при активации textbox. Или событие при изменения фокуса
Здравствуйте. Подскажите можно ли создать свое событие происходящий вовремя активации textbox. Имеется ввиду создать свой класс...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru