За последние 24 часа нас посетили 20724 программиста и 1718 роботов. Сейчас ищут 1468 программистов ...

Архитектура laravel

Тема в разделе "PHP для профи", создана пользователем alexpride1993, 31 окт 2017.

  1. alexpride1993

    alexpride1993 Новичок

    С нами с:
    28 мар 2016
    Сообщения:
    56
    Симпатии:
    20
    Всем доброго времени суток! Я давно хотел узнать как работает этот фреймворк, какая именно магия, позволяющая буквально в несколько сотен строк строить полнофункциональные приложения, происходит под капотом, но постоянно сталкивался с информационным голодом, так как практически везде описывается как пользоваться фреймворком, но не как он устроен.
    Есть записи англоязычных семинаров, приоткрывающих завесу тайны, но к сожалению я не настолько привык к английскому языку чтобы успешно интерпретировать и понимать речь лектора в быстром темпе, да и наверное в них освещены далеко не все те вопросы, на которые я хотел бы получить ответы, а в русском сегменте я не нашел ничего стоящего.
    Конечно просмотр стека вызовов и упорное чтение содержимого папки vendor рулит, но тем не менее, может быть есть какие-то ресурсы (не обязательно русскоязычные, читаю по английски неплохо), о которых я не знаю, но знает кто нибудь из форумчан, описывающие что происходит внутри фреймворка, для чего предназначены и что именно делают все те классы и их методы, использующиеся от
    Код (Text):
    1. $app->make(Illuminate\Contracts\Http\Kernel::class);
    до
    Код (Text):
    1. $kernel->terminate($request, $response);
    Заранее спасибо!
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.331
    Адрес:
    Лень
    make:
    ~ ($abstract, array $parameters = [] )
    проверка на существовании альянса из списка:
    PHP:
    1. $this->registerCoreContainerAliases();
    2.     {
    3.         $aliases = [
    4.             'app'                  => ['Illuminate\Foundation\Application', 'Illuminate\Contracts\Container\Container', 'Illuminate\Contracts\Foundation\Application'],
    5.             'auth'                 => 'Illuminate\Auth\AuthManager',
    6.             'auth.driver'          => ['Illuminate\Auth\Guard', 'Illuminate\Contracts\Auth\Guard'],
    7.             'auth.password.tokens' => 'Illuminate\Auth\Passwords\TokenRepositoryInterface',
    8.             'blade.compiler'       => 'Illuminate\View\Compilers\BladeCompiler',
    9.             'cache'                => ['Illuminate\Cache\CacheManager', 'Illuminate\Contracts\Cache\Factory'],
    10.             'cache.store'          => ['Illuminate\Cache\Repository', 'Illuminate\Contracts\Cache\Repository'],
    11.             'config'               => ['Illuminate\Config\Repository', 'Illuminate\Contracts\Config\Repository'],
    12.             'cookie'               => ['Illuminate\Cookie\CookieJar', 'Illuminate\Contracts\Cookie\Factory', 'Illuminate\Contracts\Cookie\QueueingFactory'],
    13.             'encrypter'            => ['Illuminate\Encryption\Encrypter', 'Illuminate\Contracts\Encryption\Encrypter'],
    14.             'db'                   => 'Illuminate\Database\DatabaseManager',
    15.             'db.connection'        => ['Illuminate\Database\Connection', 'Illuminate\Database\ConnectionInterface'],
    16.             'events'               => ['Illuminate\Events\Dispatcher', 'Illuminate\Contracts\Events\Dispatcher'],
    17.             'files'                => 'Illuminate\Filesystem\Filesystem',
    18.             'filesystem'           => ['Illuminate\Filesystem\FilesystemManager', 'Illuminate\Contracts\Filesystem\Factory'],
    19.             'filesystem.disk'      => 'Illuminate\Contracts\Filesystem\Filesystem',
    20.             'filesystem.cloud'     => 'Illuminate\Contracts\Filesystem\Cloud',
    21.             'hash'                 => 'Illuminate\Contracts\Hashing\Hasher',
    22.             'translator'           => ['Illuminate\Translation\Translator', 'Symfony\Component\Translation\TranslatorInterface'],
    23.             'log'                  => ['Illuminate\Log\Writer', 'Illuminate\Contracts\Logging\Log', 'Psr\Log\LoggerInterface'],
    24.             'mailer'               => ['Illuminate\Mail\Mailer', 'Illuminate\Contracts\Mail\Mailer', 'Illuminate\Contracts\Mail\MailQueue'],
    25.             'auth.password'        => ['Illuminate\Auth\Passwords\PasswordBroker', 'Illuminate\Contracts\Auth\PasswordBroker'],
    26.             'queue'                => ['Illuminate\Queue\QueueManager', 'Illuminate\Contracts\Queue\Factory', 'Illuminate\Contracts\Queue\Monitor'],
    27.             'queue.connection'     => 'Illuminate\Contracts\Queue\Queue',
    28.             'redirect'             => 'Illuminate\Routing\Redirector',
    29.             'redis'                => ['Illuminate\Redis\Database', 'Illuminate\Contracts\Redis\Database'],
    30.             'request'              => 'Illuminate\Http\Request',
    31.             'router'               => ['Illuminate\Routing\Router', 'Illuminate\Contracts\Routing\Registrar'],
    32.             'session'              => 'Illuminate\Session\SessionManager',
    33.             'session.store'        => ['Illuminate\Session\Store', 'Symfony\Component\HttpFoundation\Session\SessionInterface'],
    34.             'url'                  => ['Illuminate\Routing\UrlGenerator', 'Illuminate\Contracts\Routing\UrlGenerator'],
    35.             'validator'            => ['Illuminate\Validation\Factory', 'Illuminate\Contracts\Validation\Factory'],
    36.             'view'                 => ['Illuminate\View\Factory', 'Illuminate\Contracts\View\Factory'],
    37.         ];
    38.  
    39.         foreach ($aliases as $key => $aliases)
    40.         {
    41.             foreach ( (array) $aliases as $alias)
    42.             {
    43.                 $this->alias($key, $alias); ($abstract, $alias)
    44.                 {
    45.                     $this->aliases[$alias] = $abstract;
    46.                 }
    47.             }
    48.         }
    49.     }
    Если существует в списке:
    то мучаем себя:
    PHP:
    1. $abstract = $this->getAlias($abstract);
    2. {
    3.     if (!isset($this->aliases[$abstract]))
    4.     {
    5.         return $abstract;
    6.     }
    7.    
    8.     return $this->getAlias($this->aliases[$abstract]);
    9.     {
    10.         снова в начало
    11.     }
    12. }
    если не существует
    выводит снова нашу строку Illuminate\Contracts\Http\Kernel::class
    на проверку экземпляров
    хотя стоп в пень это описывать... лучше доки прочесть или заняться мазохизмом дальше:
    https://github.com/MouseZver/My-garbage-code/blob/master/php.ru/64708/66243/laravel.php

    с 60 строки make идет..​
    --- Добавлено ---
    загрузка своей системы..
    1. альянсы
    2. постройка альянсов для чужих библиотек
    3. экземпляры (свои)
    4. загрузка чужих экземпляров
    5. все через ReflectionClass
    --- Добавлено ---
    https://php.net/manual/ru/class.reflectionclass.php
     
    alexpride1993 нравится это.
  3. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.584
    Симпатии:
    1.762
    @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-контейнер очень неплох
     
    alexpride1993 нравится это.
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.331
    Адрес:
    Лень
    в коде читаю смысл один... а в выданной ссылке на док, другое что - то :)
     
  5. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.584
    Симпатии:
    1.762
    И нафига по твоему вся эта возня с алиасами?
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.331
    Адрес:
    Лень
    @mkramer

    союз между государствами для достижения общих целей в определённое время; объединение отдельных лиц, политических партий, гражданских организаций на основе договорных обязательств.:D
     
  7. alexpride1993

    alexpride1993 Новичок

    С нами с:
    28 мар 2016
    Сообщения:
    56
    Симпатии:
    20
    О да. Начав копаться в vendor`е обнаружил множество symfony компонентов, используемых в фреймворке, и понял что зарываться надо достаточно глубоко чтобы представить общую картину.
    Спасибо за ссылку!
    Это имеет смысл когда конечная цель - выполнить поставленную задачу. У меня же сейчас немного другая цель, я очень хочу научиться писать код лучше чем пишу сейчас, познакомиться с новыми паттернами проектирования ПО и научиться их применять, и я подумал что анализ существующей системы поможет мне в этом, так как даст возможность посмотреть на реальное, а не абстрактное ("вот у вас есть Эйфелева башня, она может быть только одна, значит это синглтон, машинка может быть красная или белая, фабрика даст вам такую которая вам нужна, Петя и Ваня сидят в школе, школа это пул объектов *взрыв мозга*") применение паттернов, что даст мне лучше понять какие задачи с помощью них следует решать.
    Грубо говоря я хочу понять как работают компоненты в системе (раскладывая ее на блоки, с начала большие, а потом все меньше и меньше), какие задачи решают, чтобы потом применять эти знания в своих проектах.
    Может конечно я взялся за слишком сложную систему, просто выбрал ее как наиболее знакомую с точки зрения пользователя (пишу на laravel CRM-ки)
    Кстати, если есть на свете какой нибудь другой фреймворк, менее сложный для восприятия и более богатый на документацию по ее внутренней архитектуре, который можно поковырять буду благодарен за наводку.

    PS: пока понял как работает DI контейнер, и это круто))
     
  8. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.584
    Симпатии:
    1.762
    Да никто не документирует внутреннюю архитектуру, делать больше нехрена :) По коду Yii2 более простой, значительно, плюс там почти всё написано самими разработчиками. Правда, Laravel ближе к PSR-ам последним.

    Паттерны хорошо, и с примерами, объясняются здесь а также в книге "PHP. Объекты, шаблоны и методики программирования" Мэтта Зандстры. Потом, когда нужны паттерны, в голове всплывают. Не скажу, что это нужно в каждом проекте.
     
    alexpride1993 и artoodetoo нравится это.
  9. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    https://laravel.com/docs/5.5/container вот жеж, целый раздел c описанием
    --- Добавлено ---
    Гуглить дополнительно на тему "dependency injection"
     
  10. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.584
    Симпатии:
    1.762
    @romach, я уже давал эту ссылку. ТС хочет по косточкам весь исходник разложить Laravel, в надежде, что это улучшит его стиль программирования.
     
    romach нравится это.
  11. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.331
    Адрес:
    Лень
    Это вполне может стиль улучшить и понимания логического структурирования.
     
  12. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    @alexpride1993 Почитай Макконела - это должно больше помочь.
     
  13. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    интересный докладчик. скакнул в другую тему, про то как быть программистом — очень адекватно
     
    #13 artoodetoo, 1 ноя 2017
    Последнее редактирование: 3 ноя 2017
  14. alexpride1993

    alexpride1993 Новичок

    С нами с:
    28 мар 2016
    Сообщения:
    56
    Симпатии:
    20
    Большое спасибо всем за ответы! Пока начал читать книгу по совету mkramer'а и ковыряться в компонентах Symfony, с переменным, но все же успехом)