Всем доброго времени суток! Я давно хотел узнать как работает этот фреймворк, какая именно магия, позволяющая буквально в несколько сотен строк строить полнофункциональные приложения, происходит под капотом, но постоянно сталкивался с информационным голодом, так как практически везде описывается как пользоваться фреймворком, но не как он устроен. Есть записи англоязычных семинаров, приоткрывающих завесу тайны, но к сожалению я не настолько привык к английскому языку чтобы успешно интерпретировать и понимать речь лектора в быстром темпе, да и наверное в них освещены далеко не все те вопросы, на которые я хотел бы получить ответы, а в русском сегменте я не нашел ничего стоящего. Конечно просмотр стека вызовов и упорное чтение содержимого папки vendor рулит, но тем не менее, может быть есть какие-то ресурсы (не обязательно русскоязычные, читаю по английски неплохо), о которых я не знаю, но знает кто нибудь из форумчан, описывающие что происходит внутри фреймворка, для чего предназначены и что именно делают все те классы и их методы, использующиеся от Код (Text): $app->make(Illuminate\Contracts\Http\Kernel::class); до Код (Text): $kernel->terminate($request, $response); Заранее спасибо!
make: ~ ($abstract, array $parameters = [] ) проверка на существовании альянса из списка: Спойлер: альянсы PHP: $this->registerCoreContainerAliases(); { $aliases = [ 'app' => ['Illuminate\Foundation\Application', 'Illuminate\Contracts\Container\Container', 'Illuminate\Contracts\Foundation\Application'], 'auth' => 'Illuminate\Auth\AuthManager', 'auth.driver' => ['Illuminate\Auth\Guard', 'Illuminate\Contracts\Auth\Guard'], 'auth.password.tokens' => 'Illuminate\Auth\Passwords\TokenRepositoryInterface', 'blade.compiler' => 'Illuminate\View\Compilers\BladeCompiler', 'cache' => ['Illuminate\Cache\CacheManager', 'Illuminate\Contracts\Cache\Factory'], 'cache.store' => ['Illuminate\Cache\Repository', 'Illuminate\Contracts\Cache\Repository'], 'config' => ['Illuminate\Config\Repository', 'Illuminate\Contracts\Config\Repository'], 'cookie' => ['Illuminate\Cookie\CookieJar', 'Illuminate\Contracts\Cookie\Factory', 'Illuminate\Contracts\Cookie\QueueingFactory'], 'encrypter' => ['Illuminate\Encryption\Encrypter', 'Illuminate\Contracts\Encryption\Encrypter'], 'db' => 'Illuminate\Database\DatabaseManager', 'db.connection' => ['Illuminate\Database\Connection', 'Illuminate\Database\ConnectionInterface'], 'events' => ['Illuminate\Events\Dispatcher', 'Illuminate\Contracts\Events\Dispatcher'], 'files' => 'Illuminate\Filesystem\Filesystem', 'filesystem' => ['Illuminate\Filesystem\FilesystemManager', 'Illuminate\Contracts\Filesystem\Factory'], 'filesystem.disk' => 'Illuminate\Contracts\Filesystem\Filesystem', 'filesystem.cloud' => 'Illuminate\Contracts\Filesystem\Cloud', 'hash' => 'Illuminate\Contracts\Hashing\Hasher', 'translator' => ['Illuminate\Translation\Translator', 'Symfony\Component\Translation\TranslatorInterface'], 'log' => ['Illuminate\Log\Writer', 'Illuminate\Contracts\Logging\Log', 'Psr\Log\LoggerInterface'], 'mailer' => ['Illuminate\Mail\Mailer', 'Illuminate\Contracts\Mail\Mailer', 'Illuminate\Contracts\Mail\MailQueue'], 'auth.password' => ['Illuminate\Auth\Passwords\PasswordBroker', 'Illuminate\Contracts\Auth\PasswordBroker'], 'queue' => ['Illuminate\Queue\QueueManager', 'Illuminate\Contracts\Queue\Factory', 'Illuminate\Contracts\Queue\Monitor'], 'queue.connection' => 'Illuminate\Contracts\Queue\Queue', 'redirect' => 'Illuminate\Routing\Redirector', 'redis' => ['Illuminate\Redis\Database', 'Illuminate\Contracts\Redis\Database'], 'request' => 'Illuminate\Http\Request', 'router' => ['Illuminate\Routing\Router', 'Illuminate\Contracts\Routing\Registrar'], 'session' => 'Illuminate\Session\SessionManager', 'session.store' => ['Illuminate\Session\Store', 'Symfony\Component\HttpFoundation\Session\SessionInterface'], 'url' => ['Illuminate\Routing\UrlGenerator', 'Illuminate\Contracts\Routing\UrlGenerator'], 'validator' => ['Illuminate\Validation\Factory', 'Illuminate\Contracts\Validation\Factory'], 'view' => ['Illuminate\View\Factory', 'Illuminate\Contracts\View\Factory'], ]; foreach ($aliases as $key => $aliases) { foreach ( (array) $aliases as $alias) { $this->alias($key, $alias); ($abstract, $alias) { $this->aliases[$alias] = $abstract; } } } } Если существует в списке: то мучаем себя: Спойлер: getAlias PHP: $abstract = $this->getAlias($abstract); { if (!isset($this->aliases[$abstract])) { return $abstract; } return $this->getAlias($this->aliases[$abstract]); { снова в начало } } если не существует выводит снова нашу строку Illuminate\Contracts\Http\Kernel::class на проверку экземпляров хотя стоп в пень это описывать... лучше доки прочесть или заняться мазохизмом дальше: https://github.com/MouseZver/My-garbage-code/blob/master/php.ru/64708/66243/laravel.php с 60 строки make идет..--- Добавлено --- загрузка своей системы.. альянсы постройка альянсов для чужих библиотек экземпляры (свои) загрузка чужих экземпляров все через ReflectionClass --- Добавлено --- https://php.net/manual/ru/class.reflectionclass.php
@alexpride1993, ну это слишком глубоко копать надо, поскольку большая часть Laravel надстроена над другим фреймворком - Symfony, который очень мощный, но не очень удобный (ИМХО, естественно). Laravel как раз это неудобство и убирает. В принципе, жизненный цикл приложения в общих чертах описан и в официальной документации: https://laravel.com/docs/master/lifecycle. Я, в принципе, предпочитаю ко всему, что в папке vendor относится как к чёрному ящику, до тех пор, пока мне хватает функциональности. Если требуется расширить или что-то работает не так, как ожидается - начинаешь уже читать исходник. Вот пример, когда мне пришлось дойти до системных настроек linux-программы, через исходники Laravel и Symfony. Тут трассировка очень помогает. --- Добавлено --- @MouseZver, то, что ты описал - это работа DI-контейнера. https://laravel.com/docs/master/container. DI-контейнер - это ООП-паттерн, решающий задачу динамического разрешения зависимостей. В Laravel встроенный DI-контейнер очень неплох
@mkramer союз между государствами для достижения общих целей в определённое время; объединение отдельных лиц, политических партий, гражданских организаций на основе договорных обязательств.
О да. Начав копаться в vendor`е обнаружил множество symfony компонентов, используемых в фреймворке, и понял что зарываться надо достаточно глубоко чтобы представить общую картину. Спасибо за ссылку! Это имеет смысл когда конечная цель - выполнить поставленную задачу. У меня же сейчас немного другая цель, я очень хочу научиться писать код лучше чем пишу сейчас, познакомиться с новыми паттернами проектирования ПО и научиться их применять, и я подумал что анализ существующей системы поможет мне в этом, так как даст возможность посмотреть на реальное, а не абстрактное ("вот у вас есть Эйфелева башня, она может быть только одна, значит это синглтон, машинка может быть красная или белая, фабрика даст вам такую которая вам нужна, Петя и Ваня сидят в школе, школа это пул объектов *взрыв мозга*") применение паттернов, что даст мне лучше понять какие задачи с помощью них следует решать. Грубо говоря я хочу понять как работают компоненты в системе (раскладывая ее на блоки, с начала большие, а потом все меньше и меньше), какие задачи решают, чтобы потом применять эти знания в своих проектах. Может конечно я взялся за слишком сложную систему, просто выбрал ее как наиболее знакомую с точки зрения пользователя (пишу на laravel CRM-ки) Кстати, если есть на свете какой нибудь другой фреймворк, менее сложный для восприятия и более богатый на документацию по ее внутренней архитектуре, который можно поковырять буду благодарен за наводку. PS: пока понял как работает DI контейнер, и это круто))
Да никто не документирует внутреннюю архитектуру, делать больше нехрена По коду Yii2 более простой, значительно, плюс там почти всё написано самими разработчиками. Правда, Laravel ближе к PSR-ам последним. Паттерны хорошо, и с примерами, объясняются здесь а также в книге "PHP. Объекты, шаблоны и методики программирования" Мэтта Зандстры. Потом, когда нужны паттерны, в голове всплывают. Не скажу, что это нужно в каждом проекте.
https://laravel.com/docs/5.5/container вот жеж, целый раздел c описанием --- Добавлено --- Гуглить дополнительно на тему "dependency injection"
@romach, я уже давал эту ссылку. ТС хочет по косточкам весь исходник разложить Laravel, в надежде, что это улучшит его стиль программирования.
Большое спасибо всем за ответы! Пока начал читать книгу по совету mkramer'а и ковыряться в компонентах Symfony, с переменным, но все же успехом)