{{TOC}} {{DOCVER 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51, 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11}} == Введение == Структура Laravel-приложения по умолчанию - отличная отправная точка как для больших, так и для маленьких приложений. Но, конечно, вы можете свободно организовать ваше приложение как пожелаете. Laravel не накладывает практически никаких ограничений на то, где будет размещён какой-либо класс, пока Composer будет в состоянии автоматически загружать этот класс. %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) **Где каталог с моделями?** В начале изучения Laravel многие разработчики удивляются отсутствию каталога %%(t)models%%. Однако, это сделано специально. Мы считаем, что слово "модели" очень неопределённое, потому что оно означает совершенно разные вещи для разных людей. Для некоторых разработчиков "модель" приложения - это вообще вся бизнес-логика приложения, а для других "модели" - это классы, взаимодействующие с реляционной базой данных. Поэтому мы решили поместить модели Eloquent в каталог %%(t)app%% и позволить разработчикам разместить их где-нибудь в другом месте, если они захотят. %% == Корневой каталог == ===app=== Папка **app**, как вы можете догадаться, содержит код ядра вашего приложения . Ниже мы рассмотрим эту папку подробнее; однако, почти все классы вашего приложения будут находится в этой папке. ===bootstrap=== Папка **bootstrap** содержит файлы, которые загружают фреймворк и настраивают автозагрузку. Также в папке **bootstrap** находится папка **cache**, которая содержит сгенерированные фреймворком файлы для оптимизации производительности - например, кэш-файлы маршрутов и сервисов. ===config=== Папка **config**, как гласит её название, содержит все конфигурационные файлы ваших приложений. Будет не лишним прочитать эти файлы и ознакомиться со всеми доступными параметрами. ===database=== Папка **database** содержит миграции и классы для наполнения начальными данными вашей БД. При необходимости эту папку можно использовать для хранения базы данных SQLite. ===public=== Папка **public** содержит файл %%(t)index.php%%, который является входной точкой для всех запросов, поступающих в ваше приложение. Также эта папка содержит ваши ресурсы, такие как изображения, JavaScript, CSS. ===resources=== Папка **resources** содержит ваши представления, а также сырые, некомпилированные ресурсы, такие как LESS, SASS, JavaScript. А также здесь находятся все "языковые" файлы. %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) ===routes=== Папка **routes** содержит все определения маршрутов вашего приложения. По умолчанию в Laravel встроено три файла маршрутов %%(t)web.php%%, %%(t)api.php%% и %%(t)console.php%%. **web.php** Файл %%(t)web.php%% содержит маршруты, которые %%(t)RouteServiceProvider%% помещает в группу посредников %%(t)web%%, которая обеспечивает состояние сессии, CSRF-защиту и шифрование cookie. Если ваше приложение не предоставляет "stateless" RESTful API, то скорее всего все ваши маршруты можно определить в файле %%(t)web.php%%. **api.php** Файл %%(t)api.php%% содержит маршруты, которые %%(t)RouteServiceProvider%% помещает в группу посредников %%(t)api%%, которая обеспечивает ограничение скорости. Эти маршруты должны быть "stateless", т.е. входящие через эти маршруты запросы должны быть аутентифицированы с помощью токенов и они не будут иметь доступа к состоянию сессии. **console.php** Файл %%(t)console.php%% - то место, где вы можете определить все свои консольные команды на основе замыканий. Каждое замыкание привязывается к экземпляру команды, обеспечивая простое взаимодействие с методами ввода/вывода каждой команды. Несмотря на то, что в этом файле не определяются HTTP-маршруты, в нём определяются консольные входные точки (пути) в ваше приложение. %% ===storage=== Папка **storage** содержит скомпилированные Blade-шаблоны, файл-сессии, кэши файлов и другие файлы, создаваемые фреймворком. Эта папка делится на подпапки **app**, **framework** и **logs**. В папке **app** можно хранить любые файлы, генерируемые вашим приложением. В папке **framework** хранятся создаваемые фреймворком файлы и кэш. А в папке **logs** находятся файлы журналов приложения. Папку %%(t)storage/app/public%% можно использовать для хранения пользовательских файлов, таких как аватарки, которые должны быть доступны всем. Вам надо создать символьную ссылку на %%(t)public/storage%%, которая ведёт к этой папке. Вы можете создать ссылку командой %%(sh)php artisan storage:link%%. ===tests=== Папка **tests** содержит ваши автотесты. Изначально там уже есть пример ((https://phpunit.de/ PHPUnit)). Класс каждого теста должен иметь в имени суффикс %%(t)Test%%. Вы можете запускать свои тесты командами %%(sh)phpunit%% и %%(sh)php vendor/bin/phpunit%%. ===vendor=== Папка **vendor** содержит ваши ((https://getcomposer.org/ Composer))-зависимости. == Каталог %%(t)app%% == Основная часть вашего приложения находится в каталоге %%(t)app%%. По умолчанию этот каталог зарегистрирован под пространством имён %%App%% и автоматически загружается с помощью Composer по ((http://www.php-fig.org/psr/psr-4/ стандарту автозагрузки PSR-4)). %%(DOCNEW 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) //Вы можете изменить это пространство имён с помощью Artisan-команды// %%(sh)app:name%%. %% В каталоге %%(t)app%% находится ряд дополнительных каталогов, таких как %%(t)Console%%, %%(t)Http%% и %%(t)Providers%%. Можно сказать, что каталоги %%(t)Console%% и %%(t)Http%% предоставляют API ядра вашего приложения. Протокол HTTP и командная строка - это механизмы взаимодействия с вашим приложением, но они не содержат логики приложения. Другими словами, это просто два способа передачи команд вашему приложению. Каталог %%(t)Console%% содержит все ваши Artisan-команды, а каталог %%(t)Http%% содержит ваши контроллеры, посредники и запросы. Многие другие каталоги будут созданы в каталоге %%(t)app%%, когда вы выполните Artisan-команду %%(sh)make%% для генерирования классов. Например, каталог %%(t)app/Jobs%% не будет создан, пока вы не выполните Artisan-команду %%(sh)make:job%%, чтобы сгенерировать класс задачи. .(alert) Многие классы в каталоге %%(t)app%% можно сгенерировать Artisan-командами. Для просмотра доступных команд выполните в терминале команду %%(sh)php artisan list make%%. ===Console=== Папка %%(t)Console%% содержит все дополнительные Artisan-команды для вашего приложения. Эти команды можно сгенерировать командой %%(sh)make:command%%. Также этот каталог содержит ядро вашей консоли, где регистрируются ваши дополнительные Artisan-команды и определяются ваши ((//docs/v5/scheduling запланированные задачи)). ===Events=== Изначально этого каталога нет, он создаётся Artisan-командами %%(sh)event:generate%% и %%(sh)make:event%%. В папке %%(t)Events%%, как можно догадаться, хранятся ((/docs/v5/events классы событий)). События можно использовать для оповещения других частей приложения о каком-либо событии, что обеспечивает большую гибкость и модульность. ===Exceptions=== Папка %%(t)Exceptions%% содержит обработчик исключений вашего приложения. Эта папка также является хорошим местом для размещения всех исключений, возникающих в вашем приложении. Если вы хотите изменить то, как журналируются и отображаются ваши исключения, вам надо изменить класс %%(t)Handler%% в этом каталоге. ===Http=== Папка %%(t)Http%% содержит ваши контроллеры, посредники и запросы форм. Здесь будет размещена почти вся логика обработки запросов, входящих в приложение. ===Jobs=== Изначально этого каталога нет, он создаётся Artisan-командой %%(sh)make:job%%. В папке %%(t)Jobs%% хранятся задачи для вашего приложения. Задачи могут быть обработаны вашим приложением в порядке очереди, а также их можно запустить синхронно в рамках прохождения текущего запроса. Иногда задачи, которые запускаются синхронно во время текущего запроса, называют "командами", потому что они реализуют ((https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F) шаблон Команда)). ===Listeners=== Изначально этого каталога нет, он создаётся Artisan-командами %%(sh)event:generate%% и %%(sh)make:listener%%. Папка %%(t)Listeners%% содержит классы обработчиков для ваших ((//docs/v5/events событий)). Слушатели событий получают экземпляр события и выполняют логику в ответ на это событие. Например, событие %%(t)UserRegistered%% может быть обработано слушателем %%(t)SendWelcomeEmail%%. %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) ===Mail=== Изначально этого каталога нет, он создаётся Artisan-командой %%(sh)make:mail%%. Каталог %%(t)Mail%% содержит все ваши классы, отвечающие за отправляемые вашим приложением email-сообщения. Почтовые объекты позволяют вам инкапсулировать всю логику создания email-сообщений в единый, простой класс, который можно отправить методом %%Mail::send()%%. ===Notifications=== Изначально этого каталога нет, он создаётся Artisan-командой %%(sh)make:notification%%. Каталог %%(t)Notifications%% содержит все "транзакционные" уведомления, которые отправляются вашим приложением, например, простое уведомление о событии, произошедшем в вашем приложении. Возможность уведомлений в Laravel абстрагирует отправку уведомлений через разные драйверы, такие как email, Slack, SMS или сохранение в БД. ===Providers=== Папка %%(t)Providers%% содержит все ((//docs/v5/providers сервис-провайдеры)) для вашего приложения. Сервис-провайдеры загружают ваше приложение, привязывая сервисы в сервис-контейнер, регистрируя события, и выполняя любые другие задачи для подготовки вашего приложения к входящим запросам. В свежеустановленном приложении Laravel эта папка уже содержит несколько провайдеров. При необходимости вы можете добавлять свои провайдеры в эту папку. %% %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51, 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) ===Policies=== Изначально этого каталога нет, он создаётся Artisan-командой %%(sh)make:policy%%. Папка %%(t)Policies%% содержит классы политик авторизации. Политики служат для определения, разрешено ли пользователю данное действие над ресурсом. Подробнее читайте в ((//docs/v5/authorization документации по авторизации)). %% %%(DOCNEW 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) ===Commands=== В папке %%(t)Commands%%, разумеется, хранятся команды для вашего приложения. Команды представляют собой задания, которые могут быть обработаны вашим приложениям в порядке очереди, а также задачи, которые вы можете запустить синхронно в рамках прохождения текущего запроса. ===Handlers=== Папка %%(t)Handlers%% содержит классы обработчиков команд и событий. Обработчики получают команду или событие и выполняют логику в ответ на эту команду или возникновение события. ===Services=== Папка %%(t)Services%% содержит ряд "вспомогательных" служб, необходимых для работы вашего приложения. Например, включённая в Laravel служба %%(t)Registrar%% отвечает за проверку и создание новых пользователей вашего приложения. Другой пример - службы для взаимодействия с внешними API, с системами метрик, или даже со службами, которые собирают данные от вашего приложения. %% %%(DOCNEW 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) == Задание пространства имён для вашего приложения == Как уже было сказано, по умолчанию название пространства имён приложения - %%App%%. Но вы можете изменить его, чтобы оно совпадало с названием вашего приложения. Это можно сделать с помощью Artisan-команды %%(sh)app:name%%. Например, если ваше приложение называется %%(t)SocialNet%%, вам надо выполнить следующую команду: %%(sh) php artisan app:name SocialNet ~%% %%