X

PHP грусть или Как узнать где находится файл определенного класса в Laravel


С приходом в php, всяких вкусностей, типа неймспейсов, автолоадеров, да и просто гонкой фреймворков становится все сложнее работать с кодом. Если раньше все было просто, пара include и простыня методов, то теперь пришли фреймворки с фасадами и IoC контейнерами. В частности, исследуя некий код Laravel, я увидел следующее..

use Request;
..
redirect('form')->withInput(Request::except('password'));

Тут у меня зачесалось в затылке и захотелось исследовать данный класс Request на предмет других методов. Однако, практически сразу же возник вопрос, как найти файл этого класса. Я могу ошибаться, но одна логика тут не поможет.

Если Вы не знаете где лежит этот файл, предлагаю остановиться, поразмыслить и сравнить с результатом. Если Вы догадались логически, напишите в комментах ход Ваших мыслей 🙂

Для поиска мы воспользуемся рефлекцией (хз какой правильный русский термин, оригинал reflection). А именно надо сделать следующее:

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(), который возвращает конечный объект связанного класса. Окей, продолжаем, пробуем с помощью рефлексии найти файл класса этого объекта:

use Request;
..
die((new \ReflectionClass(get_class(Request::getFacadeRoot())))->getFileName());

и получаем...

..\www\vendor\compiled.php

Ах-ха-ха, в этот файл слиты все классы, по всей видимости для ускорения загрузки... Можно конечно тут поковыряться, но это не совсем то, что надо.. ладно, смотрим имя класса:

use Request;
..
die(get_class(Request::getFacadeRoot()));

получаем:

Illuminate\Http\Request

Ок, расположение Illuminate мы уже видели, поэтому предполагаем что путь к реальному файлу будет такой:

..\www\vendor\laravel\framework\src\Illuminate\Http\Request.php

открываем, смотрим ... да, это именно он и есть..

Для того, чтобы убедиться можем добавить туда тестовый метод:

 public function test() {
  throw new \Exception('test');
 }

и вызвать его так:

Request::getFacadeRoot()->test();

не забыв предварительно переименовать vendor/compiled.php в что-то другое, например: vendor/compiled.php.bak

Так же, после того как мы переименовали vendor/compiled.php в нечто другое, вот этот код:

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-ах и прочих "упрощающих работу" приблуд.. Знаете как выглядел типичный код сайта? Вот так:

<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 секунд ... эхх были времена..

Вот еще картинка "в тему":

Стартуем сайт в 2014 году

Хотя, может быть, это я просто старею..

P.S. Если Вы человек, который собеседует Laravel программистов, тогда у вас есть возможность, протестировать знания человека всего одним вопросом:

В контроллере есть код use Request;, по какому пути находится файл с этим классом и объект какого класса создается при вызове Request::something();. Если человек сможет правильно ответить на этот вопрос, можете смело его брать на работу - он или отличный программист или читатель моего блога или разработчик laravel 🙂

Категории: Frameworks

Комментарии (1)

  • P.S. Если Вы человек, который собеседует Laravel программистов, тогда у вас есть возможность, протестировать знания человека всего одним вопросом:

    В контроллере есть код use Request;, по какому пути находится файл с этим классом и объект какого класса создается при вызове Request::something();. Если человек сможет правильно ответить на этот вопрос, можете смело его брать на работу - он или отличный программист или читатель моего блога или разработчик laravel

    это 2 вопроса.
    Спасибо, очень познавательная статья.