PHP грусть или Как узнать где находится файл определенного класса в Laravel
С приходом в php, всяких вкусностей, типа неймспейсов, автолоадеров, да и просто гонкой фреймворков становится все сложнее работать с кодом. Если раньше все было просто, пара include и простыня методов, то теперь пришли фреймворки с фасадами и IoC контейнерами. В частности, исследуя некий код Laravel, я увидел следующее..
1 2 3 4 5 |
use Request; .. redirect('form')->withInput(Request::except('password')); |
Тут у меня зачесалось в затылке и захотелось исследовать данный класс Request на предмет других методов. Однако, практически сразу же возник вопрос, как найти файл этого класса. Я могу ошибаться, но одна логика тут не поможет.
Если Вы не знаете где лежит этот файл, предлагаю остановиться, поразмыслить и сравнить с результатом. Если Вы догадались логически, напишите в комментах ход Ваших мыслей 🙂
Для поиска мы воспользуемся рефлекцией (хз какой правильный русский термин, оригинал reflection). А именно надо сделать следующее:
1 2 3 4 5 |
use Request; .. die((new \ReflectionClass('Request'))->getFileName()); |
Результат будет следующий:
..\www\vendor\laravel\framework\src\Illuminate\Support\Facades\Request.php
Теперь если мы сходим в этот файл, мы узнаем что это фасад для IoC контейнера, окау, посмотрев методы класса
..\www\vendor\laravel\framework\src\Illuminate\Support\Facades\Facade.php
мы находим метод getFacadeRoot(), который возвращает конечный объект связанного класса. Окей, продолжаем, пробуем с помощью рефлексии найти файл класса этого объекта:
1 2 3 4 5 |
use Request; .. die((new \ReflectionClass(get_class(Request::getFacadeRoot())))->getFileName()); |
и получаем...
..\www\vendor\compiled.php
Ах-ха-ха, в этот файл слиты все классы, по всей видимости для ускорения загрузки... Можно конечно тут поковыряться, но это не совсем то, что надо.. ладно, смотрим имя класса:
1 2 3 4 5 |
use Request; .. die(get_class(Request::getFacadeRoot())); |
получаем:
Illuminate\Http\Request
Ок, расположение Illuminate мы уже видели, поэтому предполагаем что путь к реальному файлу будет такой:
..\www\vendor\laravel\framework\src\Illuminate\Http\Request.php
открываем, смотрим ... да, это именно он и есть..
Для того, чтобы убедиться можем добавить туда тестовый метод:
1 2 3 4 5 |
public function test() { throw new \Exception('test'); } |
и вызвать его так:
1 2 3 |
Request::getFacadeRoot()->test(); |
не забыв предварительно переименовать vendor/compiled.php в что-то другое, например: vendor/compiled.php.bak
Так же, после того как мы переименовали vendor/compiled.php в нечто другое, вот этот код:
1 2 3 4 5 |
use Request; .. die((new \ReflectionClass(get_class(Request::getFacadeRoot())))->getFileName()); |
будет давать правильный путь:
..\www\vendor\laravel\framework\src\Illuminate\Http\Request.php
Ну, а для тех кого заинтересуют другие возможности ReflectionClass оставляю ссылку на ман: Reflection Class на php.net
Вывод
Говорят, что фреймворки рулят - их просто освоить и в дальнейшем использовать все уже готовенькое.. Я не знаю как человек без опыта разработки, может "легко освоить" нечто подобное. Пустой проект на Laravel содержит 4700 файлов..
Знаете, я скучаю за сайтами, которые делал в 2000х, когда я не знал о всяких фреймворках, git-ах, composer-ах и прочих "упрощающих работу" приблуд.. Знаете как выглядел типичный код сайта? Вот так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<html> <head><title>My site</title></head> <body> <a href="?p=index">Main</a> | <a href="?p=goals">Goals</a> | <a href="?p=contacts">Contacts</a> <hr /> <?php if (empty($_GET['p'])) $_GET['p'] = 'index'; switch($_GET['p']) { default: case 'index': ?><h1>Main page</h1><p>Main page content</p><?php break; case 'goals': ?><h1>Our goals</h1><p>Goals page content</p><?php break; case 'contacts': ?><h1>Our contacts</h1><p>Our phone and address</p><?php break; } ?> </body> </html> |
ПРОЕКТ!!! - 1 файл, 505 символов, 3и веб-страницы. Порог входа 30 секунд ... эхх были времена..
Вот еще картинка "в тему":
Хотя, может быть, это я просто старею..
P.S. Если Вы человек, который собеседует Laravel программистов, тогда у вас есть возможность, протестировать знания человека всего одним вопросом:
В контроллере есть код
use Request;
, по какому пути находится файл с этим классом и объект какого класса создается при вызовеRequest::something();
. Если человек сможет правильно ответить на этот вопрос, можете смело его брать на работу - он или отличный программист или читатель моего блога или разработчик laravel 🙂
Author: | Tags: /
| Rating:
1 comment.
Write a comment