Уважаемые посетители и знатоки php очень нуждаюсь в вашей помощи, для того чтоб понять правильно ли я понимаю содержание этого класса Код (PHP): <?php namespace Api\Security\Authentication; use Api\Exception\ApiException; use Api\Security\SessionManager; use Psr\Log\LoggerAwareTrait; use Silex\Application; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\GetResponseEvent; use Symfony\Component\HttpKernel\KernelEvents; class UserAuthenticator implements EventSubscriberInterface { use LoggerAwareTrait; /** * @var Credentials */ private $credentials; /** * @var SessionManager */ private $sessionManager; /** * @var array */ private $excludedRoutes = []; public function __construct(Credentials $credentials, SessionManager $sessionManager, array $excludedRoutes) { $this->credentials = $credentials; $this->sessionManager = $sessionManager; $this->excludedRoutes = $excludedRoutes; } /** * @param $route * @return bool */ private function isExcludedRoute($route) { return in_array($route, $this->excludedRoutes); } /** * @param GetResponseEvent $event * @throws ApiException */ public function onRequest(GetResponseEvent $event) { $request = $event->getRequest(); $route = $request->attributes->get('_route'); if ($this->isExcludedRoute($route)) { if ($this->logger) { $this->logger->info('Route excluded from auth'); } return; } $authHeader = $request->headers->get('Authorization'); if ($this->logger) { $this->logger->info('Authorization header', ['Authorization' => $authHeader]); } if (! preg_match('/^Token (.+)/i', $authHeader, $matches)) { $event->setResponse(new Response('', 401, ['WWW-Authenticate' => 'Token'])); return; } $token = $matches[1]; $userId = $this->sessionManager->getUserId($token); if (null === $userId) { throw ApiException::create(ApiException::INVALID_TOKEN); } $this->credentials->setUser($userId); } /** * Returns an array of event names this subscriber wants to listen to. * * The array keys are event names and the value can be: * * * The method name to call (priority defaults to 0) * * An array composed of the method name to call and the priority * * An array of arrays composed of the method names to call and respective * priorities, or 0 if unset * * For instance: * * * array('eventName' => 'methodName') * * array('eventName' => array('methodName', $priority)) * * array('eventName' => array(array('methodName1', $priority), array('methodName2')) * * @return array The event names to listen to */ public static function getSubscribedEvents() { return [ KernelEvents::REQUEST => 'onRequest', ]; } } ниже в комментариях я постараюсь раскрыть свое видение этого класса и объяснить его логику, я знаю что будет куча ошибок и поэтом упрошу вас мне помочь поправлять меня и сильно не смеяться. Добавлено спустя 2 минуты 21 секунду: В начале в данном классе объявлены свойства credentials, Session manager, и exludedRoutes который является массивом Код (PHP): class UserAuthenticator implements EventSubscriberInterface { use LoggerAwareTrait; /** * @var Credentials */ private $credentials; /** * @var SessionManager */ private $sessionManager; /** * @var array */ private $excludedRoutes = []; Добавлено спустя 10 минут 15 секунд: Далее в классе объявлен конструктор класса, и вот тут у меня возник первый вопрос в параметрах конструктора передаются значения которые передаются конструктору во время объявления нового объекта класса и эти значения Код (PHP): Credentials $credentials, SessionManager $sessionManager, array $excludedRoutes что это за вставки Код (PHP): Credentials, SessionManager, ????? что это может значить это какие то спец слова в php или что ? далее в теле конструктора класса свойствам класса Код (PHP): $this->credentials = $credentials; $this->sessionManager = $sessionManager; $this->excludedRoutes= $excludedRoutes; передаются параметры Подсказка от модератора: Любой код или текст конфигурации пишите между тегом [code=php] и [/code]. Используйте отступы в коде для форматирования текста. Это помогает быстрее понять вас, увеличивает шанс на получение ответа. Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
Re: Помогите разобрать класс по полочкам, скажу сразу он не Это указан Тип данных, которые ожидает конструктор. т.е. $credentials - объект класса Credentials $sessionManager - объект класса SessionManager $excludedRoutes - должен быть массивом
Затем идет еще более интересный фрагмент кода, который я чуть не понял Код (PHP): /** * @param $route * @return bool */ private function isExcludedRoute($route) { return in_array($route, $this->excludedRoutes); } В тегах @ сообщается что функция return возвращает булевое значение, Вопрос Код (PHP): @param $route * @return bool вот эти две строки это одно целое только написанное на двух строках? Как я понял тут объявляется закрытая функция под названием isExcludedRoute я гуглил и на сколько я понял это пользовательская функция а не заранее определенная в php. Так вот в теле данной функции имеется return который возвращает результат проверки посредством функции in_array есть ли в массиве excludedRoutes значение $route и функция должна вернуть булевое значение Добавлено спустя 46 секунд: Re: Помогите разобрать класс по полочкам, скажу сразу он не прос Теперь понял спасибо за правку. Добавлено спустя 2 минуты 11 секунд: Re: Помогите разобрать класс по полочкам, скажу сразу он не прос Ну а дальше идет самый трудный для моего понимания метод. Код (PHP): public function onRequest(GetResponseEvent $event) { $request = $event->getRequest(); $route = $request->attributes->get('_route'); if ($this->isExcludedRoute($route)) { if ($this->logger) { $this->logger->info('Route excluded from auth'); } return; } $authHeader = $request->headers->get('Authorization'); if ($this->logger) { $this->logger->info('Authorization header', ['Authorization' => $authHeader]); } if (! preg_match('/^Token (.+)/i', $authHeader, $matches)) { $event->setResponse(new Response('', 401, ['WWW-Authenticate' => 'Token'])); return; } $token = $matches[1]; $userId = $this->sessionManager->getUserId($token); if (null === $userId) { throw ApiException::create(ApiException::INVALID_TOKEN); } $this->credentials->setUser($userId); } Добавлено спустя 6 минут 48 секунд: Re: Помогите разобрать класс по полочкам, скажу сразу он не прос В ней объявлена публичный метод onRequest в параметрах которого передано значение $event класса GetResponseEvent. Далее в теле функции следует переменная $request равна переменной $event которая как я понял является\ объектом такой вывод я делаю потому как данная переменная $event вызывает метод $event->getRequest(); затем далее переменной $route присваивается значение переменной $request которая вызывает Код (PHP): $request->attributes->get('_route'); вот эту часть кода я вообще не понял могбы кто нибудь объяснить? как я понял переменная $request объявлена в теле функции onRequest на какое свойство или метод ссылается данная переменная Код (PHP): $request->attributes->get('_route'); ?????????? Добавлено спустя 3 минуты 58 секунд: Re: Помогите разобрать класс по полочкам, скажу сразу он не прос Дальше еще интереснее для меня Код (PHP): if ($this->isExcludedRoute($route)) { if ($this->logger) { $this->logger->info('Route excluded from auth'); } return; } если свойство ($this->isExcludedRoute($route) истина, то если ($this->logger) истина/////// Вопрос откуда logger Берется ?????? то Код (PHP): $this->logger->info('Route excluded from auth'); откуда берется ->info ???? то есть вот это Код (PHP): $this->logger->info('Route excluded from auth') Подсказка от модератора: Любой код или текст конфигурации пишите между тегом [code=php] и [/code]. Используйте отступы в коде для форматирования текста. Это помогает быстрее понять вас, увеличивает шанс на получение ответа. Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
Re: Помогите разобрать класс по полочкам, скажу сразу он не $request получает значение которое возвратит вызов метода $event->getRequest(); а он вернет объект, скорее всего. поэтому ниже можно работать с $request как с объектом. вызывать его свойства и методы, что собственно и происходит. $request->attributes->get('_route'); Это обращение к свойству attributes объекта $request. Свойство attributes является тоже объектом, у которого есть метод get(), обращаясь к которому и передавая в него некий ИД(в данном случае '_route') - получаем значение для $route. Добавлено спустя 2 минуты 52 секунды: Re: Помогите разобрать класс по полочкам, скажу сразу он не прос ничего интересного. все тоже самое. ну как откуда? посмотрите код класса этого $logger. там есть метод info(). все что вам нужно - это иметь код всех классов которые тут встречаются. далее просто лезем в них и ищем свойства и код методов, и все становится понятно. что откуда берется и как это работает.
Для начала читайте руководство по языку, поскольку вы вообще язык не знаете, суда по вопросам. А затем руководство по Symphony. Код (PHP): $request = $event->getRequest(); Вот же, переменная $requrest идёт из параметра $event, у него есть метод getRequest(), что делает - без понятия, не пользуюсь этим фреймворком. Судя по implements EventSubscriberInterface, 'здесь используется механизм событий, реализованный в Symphony каким-то образом. Насколько я знаю, у Symphony нормальная документация, хорошим английским языком всё написано. Потом, есть же исходники. Найдите класс GetResponseEvent, в нём есть метод getRequest() и т.п. Но чтоб цепочку проследить, надо хорошо понимать, что такое классы и как они работают. Писать на чужих фреймворках надо начинать, когда в состоянии написать свой.
То есть получается что переменная $request сама стала объектом, тем объектом которым переменная $event->getRequest являлась, и затем получается переменная $route становится объектом тем же самым которым является Request $request->attributes->get('_route'); Я правильно понял ?????? Добавлено спустя 4 минуты 12 секунд: Re: Помогите разобрать класс по полочкам, скажу сразу он не прос Дело в том что данный класс написан не мной и передо мной сстоит задача разобраться в нем, Язык на самом деле не знаю, ну считаю что его без практики кроме как в таком общении не возмможно узнать, практики у меня нет, потому как на чем практиковаться новичку. А вот разобрать класс самое оно, ну а так спасибо за комментарий, если как то раздражаю тебя прости.
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
Re: Помогите разобрать класс по полочкам, скажу сразу он не по поводу метода и свойства, то честно не могу понять когда идет ссылка на метод а когда на свойство, имею ввиду если предварительно не заглянуть в сам класс, ну а если нет доступа к самому классу как определить что $event->getRequest это обращение к методу или к свойству.
Re: Помогите разобрать класс по полочкам, скажу сразу он не ууу... Вот поэтому и надо сначала грамматику языка выучить. На обращение к методу указывают круглые скобки после имени.