За последние 24 часа нас посетил 61531 программист и 1741 робот. Сейчас ищут 868 программистов ...

Помогите разобрать класс по полочкам, скажу сразу он не прос

Тема в разделе "PHP для новичков", создана пользователем ParenVkedah, 14 мар 2016.

  1. ParenVkedah

    ParenVkedah Новичок

    С нами с:
    30 янв 2016
    Сообщения:
    34
    Симпатии:
    0
    Уважаемые посетители и знатоки php очень нуждаюсь в вашей помощи, для того чтоб понять правильно ли я понимаю содержание этого класса
    Код (PHP):
    1. <?php
    2. namespace Api\Security\Authentication;
    3.  
    4. use Api\Exception\ApiException;
    5. use Api\Security\SessionManager;
    6. use Psr\Log\LoggerAwareTrait;
    7. use Silex\Application;
    8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
    9. use Symfony\Component\HttpFoundation\Response;
    10. use Symfony\Component\HttpKernel\Event\GetResponseEvent;
    11. use Symfony\Component\HttpKernel\KernelEvents;
    12.  
    13. class UserAuthenticator implements EventSubscriberInterface
    14. {
    15.     use LoggerAwareTrait;
    16.  
    17.     /**
    18.      * @var Credentials
    19.      */
    20.     private $credentials;
    21.  
    22.     /**
    23.      * @var SessionManager
    24.      */
    25.     private $sessionManager;
    26.  
    27.     /**
    28.      * @var array
    29.      */
    30.     private $excludedRoutes = [];
    31.  
    32.     public function __construct(Credentials $credentials, SessionManager $sessionManager, array $excludedRoutes)
    33.     {
    34.         $this->credentials = $credentials;
    35.         $this->sessionManager = $sessionManager;
    36.         $this->excludedRoutes = $excludedRoutes;
    37.     }
    38.  
    39.     /**
    40.      * @param $route
    41.      * @return bool
    42.      */
    43.     private function isExcludedRoute($route)
    44.     {
    45.         return in_array($route, $this->excludedRoutes);
    46.     }
    47.  
    48.     /**
    49.      * @param GetResponseEvent $event
    50.      * @throws ApiException
    51.      */
    52.     public function onRequest(GetResponseEvent $event)
    53.     {
    54.         $request = $event->getRequest();
    55.         $route = $request->attributes->get('_route');
    56.         if ($this->isExcludedRoute($route)) {
    57.             if ($this->logger) {
    58.                 $this->logger->info('Route excluded from auth');
    59.             }
    60.             return;
    61.         }
    62.  
    63.         $authHeader = $request->headers->get('Authorization');
    64.         if ($this->logger) {
    65.             $this->logger->info('Authorization header', ['Authorization' => $authHeader]);
    66.         }
    67.         if (! preg_match('/^Token (.+)/i', $authHeader, $matches)) {
    68.             $event->setResponse(new Response('', 401, ['WWW-Authenticate' => 'Token']));
    69.             return;
    70.         }
    71.         $token = $matches[1];
    72.         $userId = $this->sessionManager->getUserId($token);
    73.         if (null === $userId) {
    74.             throw ApiException::create(ApiException::INVALID_TOKEN);
    75.         }
    76.         $this->credentials->setUser($userId);
    77.     }
    78.  
    79.     /**
    80.      * Returns an array of event names this subscriber wants to listen to.
    81.      *
    82.      * The array keys are event names and the value can be:
    83.      *
    84.      *  * The method name to call (priority defaults to 0)
    85.      *  * An array composed of the method name to call and the priority
    86.      *  * An array of arrays composed of the method names to call and respective
    87.      *    priorities, or 0 if unset
    88.      *
    89.      * For instance:
    90.      *
    91.      *  * array('eventName' => 'methodName')
    92.      *  * array('eventName' => array('methodName', $priority))
    93.      *  * array('eventName' => array(array('methodName1', $priority), array('methodName2'))
    94.      *
    95.      * @return array The event names to listen to
    96.      */
    97.     public static function getSubscribedEvents()
    98.     {
    99.         return [
    100.             KernelEvents::REQUEST => 'onRequest',
    101.         ];
    102.     }
    103. } 
    ниже в комментариях я постараюсь раскрыть свое видение этого класса и объяснить его логику, я знаю что будет куча ошибок и поэтом упрошу вас мне помочь поправлять меня и сильно не смеяться.

    Добавлено спустя 2 минуты 21 секунду:
    В начале в данном классе объявлены свойства credentials, Session manager, и exludedRoutes который является массивом
    Код (PHP):
    1. class UserAuthenticator implements EventSubscriberInterface
    2. {
    3.     use LoggerAwareTrait;
    4.  
    5.     /**
    6.      * @var Credentials
    7.      */
    8.     private $credentials;
    9.  
    10.     /**
    11.      * @var SessionManager
    12.      */
    13.     private $sessionManager;
    14.  
    15.     /**
    16.      * @var array
    17.      */
    18.     private $excludedRoutes = []; 
    Добавлено спустя 10 минут 15 секунд:
    Далее в классе объявлен конструктор класса, и вот тут у меня возник первый вопрос в параметрах конструктора передаются значения которые передаются конструктору во время объявления нового объекта класса и эти значения
    Код (PHP):
    1. Credentials $credentials, SessionManager $sessionManager, array $excludedRoutes
    что это за вставки
    Код (PHP):
    1. Credentials, SessionManager,   
    ????? что это может значить это какие то спец слова в php или что ? далее в теле конструктора класса свойствам класса
    Код (PHP):
    1. $this->credentials = $credentials;
    2.         $this->sessionManager = $sessionManager;
    3.         $this->excludedRoutes= $excludedRoutes; 
    передаются параметры

    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    Re: Помогите разобрать класс по полочкам, скажу сразу он не

    Это указан Тип данных, которые ожидает конструктор. т.е.
    $credentials - объект класса Credentials
    $sessionManager - объект класса SessionManager
    $excludedRoutes - должен быть массивом
     
  3. ParenVkedah

    ParenVkedah Новичок

    С нами с:
    30 янв 2016
    Сообщения:
    34
    Симпатии:
    0
    Затем идет еще более интересный фрагмент кода, который я чуть не понял
    Код (PHP):
    1.  /**
    2.      * @param $route
    3.      * @return bool
    4.      */
    5.     private function isExcludedRoute($route)
    6.     {
    7.         return in_array($route, $this->excludedRoutes);
    8.     } 
    В тегах @ сообщается что функция return возвращает булевое значение, Вопрос
    Код (PHP):
    1. @param $route
    2.      * @return bool
    вот эти две строки это одно целое только написанное на двух строках? Как я понял тут объявляется закрытая функция под названием isExcludedRoute я гуглил и на сколько я понял это пользовательская функция а не заранее определенная в php. Так вот в теле данной функции имеется return который возвращает результат проверки посредством функции in_array есть ли в массиве excludedRoutes значение $route и функция должна вернуть булевое значение

    Добавлено спустя 46 секунд:
    Re: Помогите разобрать класс по полочкам, скажу сразу он не прос
    Теперь понял спасибо за правку.

    Добавлено спустя 2 минуты 11 секунд:
    Re: Помогите разобрать класс по полочкам, скажу сразу он не прос
    Ну а дальше идет самый трудный для моего понимания метод.
    Код (PHP):
    1. public function onRequest(GetResponseEvent $event)
    2.     {
    3.         $request = $event->getRequest();
    4.         $route = $request->attributes->get('_route');
    5.         if ($this->isExcludedRoute($route)) {
    6.             if ($this->logger) {
    7.                 $this->logger->info('Route excluded from auth');
    8.             }
    9.             return;
    10.         }
    11.  
    12.         $authHeader = $request->headers->get('Authorization');
    13.         if ($this->logger) {
    14.             $this->logger->info('Authorization header', ['Authorization' => $authHeader]);
    15.         }
    16.         if (! preg_match('/^Token (.+)/i', $authHeader, $matches)) {
    17.             $event->setResponse(new Response('', 401, ['WWW-Authenticate' => 'Token']));
    18.             return;
    19.         }
    20.         $token = $matches[1];
    21.         $userId = $this->sessionManager->getUserId($token);
    22.         if (null === $userId) {
    23.             throw ApiException::create(ApiException::INVALID_TOKEN);
    24.         }
    25.         $this->credentials->setUser($userId);
    26.     } 
    Добавлено спустя 6 минут 48 секунд:
    Re: Помогите разобрать класс по полочкам, скажу сразу он не прос
    В ней объявлена публичный метод onRequest в параметрах которого передано значение $event класса GetResponseEvent. Далее в теле функции следует переменная $request равна переменной $event которая как я понял является\ объектом такой вывод я делаю потому как данная переменная $event вызывает метод $event->getRequest(); затем далее переменной $route присваивается значение переменной $request которая вызывает
    Код (PHP):
    1. $request->attributes->get('_route');  
    вот эту часть кода я вообще не понял могбы кто нибудь объяснить? как я понял переменная $request объявлена в теле функции onRequest на какое свойство или метод ссылается данная переменная
    Код (PHP):
    1. $request->attributes->get('_route'); 
    ??????????

    Добавлено спустя 3 минуты 58 секунд:
    Re: Помогите разобрать класс по полочкам, скажу сразу он не прос
    Дальше еще интереснее для меня
    Код (PHP):
    1. if ($this->isExcludedRoute($route)) {
    2.             if ($this->logger) {
    3.                 $this->logger->info('Route excluded from auth');
    4.             }
    5.             return;
    6.         } 
    если свойство ($this->isExcludedRoute($route) истина, то если ($this->logger) истина/////// Вопрос откуда logger Берется ?????? то
    Код (PHP):
    1. $this->logger->info('Route excluded from auth'); 
    откуда берется ->info ???? то есть вот это
    Код (PHP):
    1. $this->logger->info('Route excluded from auth') 
    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
     
  4. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    Re: Помогите разобрать класс по полочкам, скажу сразу он не

    $request получает значение которое возвратит вызов метода $event->getRequest(); а он вернет объект, скорее всего.
    поэтому ниже можно работать с $request как с объектом. вызывать его свойства и методы, что собственно и происходит.
    $request->attributes->get('_route');
    Это обращение к свойству attributes объекта $request. Свойство attributes является тоже объектом, у которого есть метод get(), обращаясь к которому и передавая в него некий ИД(в данном случае '_route') - получаем значение для $route.

    Добавлено спустя 2 минуты 52 секунды:
    Re: Помогите разобрать класс по полочкам, скажу сразу он не прос
    ничего интересного. все тоже самое.
    ну как откуда? посмотрите код класса этого $logger. там есть метод info().

    все что вам нужно - это иметь код всех классов которые тут встречаются. далее просто лезем в них и ищем свойства и код методов, и все становится понятно. что откуда берется и как это работает.
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Для начала читайте руководство по языку, поскольку вы вообще язык не знаете, суда по вопросам. А затем руководство по Symphony.
    Код (PHP):
    1. $request = $event->getRequest();
    Вот же, переменная $requrest идёт из параметра $event, у него есть метод getRequest(), что делает - без понятия, не пользуюсь этим фреймворком. Судя по implements EventSubscriberInterface, 'здесь используется механизм событий, реализованный в Symphony каким-то образом. Насколько я знаю, у Symphony нормальная документация, хорошим английским языком всё написано. Потом, есть же исходники. Найдите класс GetResponseEvent, в нём есть метод getRequest() и т.п. Но чтоб цепочку проследить, надо хорошо понимать, что такое классы и как они работают. Писать на чужих фреймворках надо начинать, когда в состоянии написать свой.
     
  6. ParenVkedah

    ParenVkedah Новичок

    С нами с:
    30 янв 2016
    Сообщения:
    34
    Симпатии:
    0
    То есть получается что переменная $request сама стала объектом, тем объектом которым переменная $event->getRequest являлась, и затем получается переменная $route становится объектом тем же самым которым является Request $request->attributes->get('_route'); Я правильно понял ??????

    Добавлено спустя 4 минуты 12 секунд:
    Re: Помогите разобрать класс по полочкам, скажу сразу он не прос
    Дело в том что данный класс написан не мной и передо мной сстоит задача разобраться в нем, Язык на самом деле не знаю, ну считаю что его без практики кроме как в таком общении не возмможно узнать, практики у меня нет, потому как на чем практиковаться новичку. А вот разобрать класс самое оно, ну а так спасибо за комментарий, если как то раздражаю тебя прости.
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Re: Помогите разобрать класс по полочкам, скажу сразу он не

    Это не переменная, это метод (разницу знаешь?). Метод класса GetResponseEvent, который где-то в недрах Symfony зарыт. По поводу сравнения с обычным языком - то, что ты делаешь, это всё равно, что английский с Шекспира начинать учить, а не с "My name is Vasya". Ты уверен, что всё здесь понимаешь: https://php.net/manual/ru/language.oop5.php? Я что-то не уверен, поскольку иначе бы метод переменной не называл. Вот класс GetResponseEvent: https://github.com/symfony/symfony/blob/master/src/Symfony/ ... eEvent.php, вот его предок https://github.com/symfony/symfony/blob/master/src/Symfony/ ... lEvent.php, т.е. getRequest возвращает поле класса KernelEvent, которое содержит
    То есть по видимому, запрос пользователя, который в данный момент обрабатывает сайт. Но тут могу ошибаться, я пользуюсь другим фреймворком. Но смог разобраться, потому что у меня нет проблем с пониманием, что такое классы, а у тебя есть. По поводу раздражаю - это ещё Ganzal сюда не пришёл :) Я-то скромный и спокойный :)

    Добавлено спустя 2 минуты 55 секунд:
    Re: Помогите разобрать класс по полочкам, скажу сразу он не прос
    Если бы мне пришлось разбираться с чужим кодом на Symfony, я бы полез https://symfony.com/doc/current/book/index.html
     
  8. ParenVkedah

    ParenVkedah Новичок

    С нами с:
    30 янв 2016
    Сообщения:
    34
    Симпатии:
    0
    Re: Помогите разобрать класс по полочкам, скажу сразу он не

    по поводу метода и свойства, то честно не могу понять когда идет ссылка на метод а когда на свойство, имею ввиду если предварительно не заглянуть в сам класс, ну а если нет доступа к самому классу как определить что $event->getRequest это обращение к методу или к свойству.
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Re: Помогите разобрать класс по полочкам, скажу сразу он не

    ууу... Вот поэтому и надо сначала грамматику языка выучить. На обращение к методу указывают круглые скобки после имени.