Laraway - путь которого не существует

Август, 2022

Интро

На просторах интернета можно встретить выражения «Laravel Way», «ларавэй», «ларавэйно» и т.п.

«Laravel Way» - это негласный набор практик, принятых сообществом.

В каждом фреймворке или CMS, или в любой другой системе есть какие-либо специфичные требования и рекомендации, но чаще всего они прозрачны и опциональны. Если мы говорим о мире PHP, то большинство принципов применимы независимо от инструмента. А Laravel - это всего-лишь инструмент. Да, да, ты не ослышался, это всего-лишь набор функций, а не волшебная палочка, позволяющая тебе делать "вжух и ты в продакшене".

Как задавать вопросы?

Январь, 2023

Ааа, помогите, ничего не работает, У меня ошибка, что делать?

«Правильно заданный вопрос содержит половину ответа»

# Формулировка

Не пиши сразу в чат по любой проблеме. Сформулируй вопрос в блокноте. Напиши вопрос, прочти его (можешь вслух), подумай всё ли ты учёл, правильно ли ты донёс свою мысль, могут ли тебя понять иначе. Это называется «Метод утёнка» , суть которого проговорить вопрос или проблему, вслух или письменно.

Попробуй сократить текст, чтобы было максимум сути и минимум слов.

А теперь погугли ключевые слова из своего вопроса. Ничего не нашёл? Измени ключевые слова, уточни их. Опять ничего? Воспользуйся поиском по чату, многие проблемы уже обсуждались и не единожды. Не нашёл? Теперь задавай вопрос в чат.

500 Internal Server Error

Август, 2022

Что делать, Как исправить?

Начнём с того, что 500 - это код ответа сервера , который является обобщённым и говорит только о том, что произошла ошибка, но не говорит о самой ошибке.

Поэтому, первое что необходимо сделать - найти ошибку в логах, смотри «Где найти логи?»

Где найти логи?

Сентябрь, 2022

Где посмотреть ошибки

# Логи фреймворка

По умолчанию логи находятся по адресу storage/logs/laravel.log

В зависимости от настроек в config/logging.php, логи могут быть разделены по файлам или находиться в другой директории.

Подробнее о конфигурации логирования можно узнать в документации

Failed to open stream: Permission denied

Август, 2022

Нет прав на запись, Отказано в доступе

Дословный перевод ошибки: "Не удалось открыть поток: Отказано в доступе".

# Примеры ошибок

The stream of file "storage/logs/laravel.log" could not be opened in append mode: Failed to open stream: Permission denied. The exception occurred while attempting to log...

Unable to create lockable file. Please ensure you have permission to create files in this location.

file_put_contents(storage/framework/views/xxx.php): Failed to open stream: Permission denied

Method is not supported

Август, 2022

# Первый вариант

The POST method is not supported for this route. Supported methods: GET, HEAD.

Данная ошибка говорит о том, что метод POST (или любой другой) не поддерживается текущим роутом. Далее перечисляются допустимые методы.

POST запрос пришёл на Route::get(), а должен на Route::post(), поэтому проверь актуальный список маршрутов с помощью php artisan route:list

Target class Controller does not exist

Август, 2022

Данная ошибка актуальна для тех кто изучает Laravel по старым курсам, либо крайне невнимательно обновил фреймворк. Начиная с 8-ой версии был изменён синтаксис роутов по умолчанию.

Target class [PostController] does not exist

Раньше использовался «string syntax»:

Не сохраняется поле в БД

Август, 2022

mass assignment, fillable

# Проблема

Поле не сохраняется в базе данных без ошибок или запрос завершается ошибкой:

General error: 1364 Field 'xxx' doesn't have a default value

При этом поле не пустое и корректно передано.

Страницы возвращают 404, кроме главной

Сентябрь, 2022

не работает ЧПУ, не работают роуты

# Причина

В Laravel используется единая точка входа для запросов, поэтому web-сервер должен правильно передавать входные параметры в index.php

Следовательно, если работает только главная страница, а остальные нет, то web-сервер неверно передаёт запрос.

Laravel и shared-hosting

Июль, 2024

# Проблема

Популярнейшая ошибка начинающих разработчиков - размещение проекта на виртуальном хостинге и как следствие загрузка всего исходного кода в общедоступный каталог public_html или иной, как в случае с простыми CMS, например, WordPress. С Laravel такой подход не работает и вместо сайта отображается, или каталог с файлами, или 403 Forbidden, или сообщение о циклической переадресации, или не работают ссылки на стили, скрипты и обычные файлы.

В попытках запустить проект, разработчик совершает серьёзную ошибку и пытается перенаправить запросы в public/index.php из корня проекта.

Во-первых, это нарушение безопасности, файл .env доступен в web, как и всё остальное (composer.json, любые приватные файлы на диске, например, дамп базы данных).
Во-вторых, переадресация запросов через .htaccess это дополнительная нагрузка и увеличение TTFB.
В-третьих, это приводит к другим разнообразным проблемам связанных с некорректной "переадресацией" запроса.

Ни в коем случае не проксируй запросы через htaccess, только содержимое public должно быть доступно в web.

Как сохранить изображение

Август, 2022

как сохранить картинку

# Быстрый пример

  1. Создаём симлинк: php artisan storage:link
  2. Сохраняем изображение в storage/app/public
    1$path = $request->file('cover')->store('', 'public');
    highlight by torchlight.dev
  3. В БД сохраняем $path - это путь БЕЗ storage/app/public
  4. Отображаем в шаблоне:
    1Storage::disk('public')->url($post->cover)
    highlight by torchlight.dev

Нужен более развёрнутый пример? Смотри полную версию «Работа с файлами в Laravel»

Работа с файлами в Laravel

Август, 2022

работа с дисками

Для работы с файлами Laravel предоставляет мощную абстракцию файловой системы Storage , реализованную на библиотеке Flysystem

Экранирование данных в Blade

Август, 2022

# Проблема

Необходимо отобразить данные с html-форматированием {{ $content }}, но html отображается как текст.

Cannot add foreign key

Август, 2022

# Проблема

Попытка добавить внешний ключ к таблице приводит к одной из ошибок:

General error: 1215 Cannot add foreign key constraint

General error: 3780 Referencing column 'post_id' and referenced column 'id' in foreign key constraint 'xxx' are incompatible

General error: 1824 Failed to open the referenced table

General error: 3730 Cannot drop table 'xxx' referenced by a foreign key constraint

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails

Blocked by CORS policy

Февраль, 2024

Крайне распространённая проблема, которой забиты и тг-чаты, и stack overflow, и qna хабр... Активно набирает популярность с ростом популярности SPA и раздельных доменов для frontend и backend приложений.

# Проблема

AJAX-запрос на "api" не работает в браузере, но работает в postman. Ошибка в консоли браузера:

Access to XMLHttpRequest at 'http://localhost:8000' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Заголовки для API

Февраль, 2024

как вернуть json

# Проблема

Например, ошибка валидации перенаправляет на предыдущий адрес и добавляет текст ошибок в сессию.
Критическая ошибка отобразит html страницу с подробным описанием или просто с текстом «Error 500», если выключен debug.

Но что если в ответе необходим json? Для валидации сказано, что если запрос ожидает json, то фреймворк автоматически вернёт его с соответствующим кодом. Что это значит?

Не работает Artisan

Август, 2022

# Проблема

Вызов любой команды php artisan завершается без сообщений и ошибок.

Отсутствие каких-либо сообщений и завершение команды сигнализирует о том, что выполнение было прекращено по критической ошибке. Отображение ошибок в терминале может быть отключено в php.ini, директива display_errors

Could not find driver

Август, 2022

# Проблема

Любая попытка взаимодействия с базой данной завершается ошибкой:

[Illuminate\Database\QueryException] could not find driver

PDOException(code: 0): could not find driver at /Illuminate/Database/Connectors/Connector.php

Database Connection refused в Docker

Август, 2022

# Проблема

Не удалось подключиться к БД в докере, ошибка:

SQLSTATE[HY000] [2002] Connection refused

Способы сохранения новых данных

Август, 2022

Laraway

Согласно документации есть несколько способов создать новую модель и сохранить данные в БД.

Это неизбежно приводит к вопросу «Как правильно/лучше?» и обычно тема перетекает в холивар, с доводами а-ля "у нас в проекте пишут вот так".

Магический синтаксис

Август, 2022

Laraway

Laravel - фреймворк с лаконичным синтаксисом и местами он пытается угодить всем, предоставляя разные способы написания одного и того же кода, что часто приводит к «laraway» спорам.

Здесь я хочу рассмотреть сомнительную функциональность, которой нет в документации, но тем не менее её применяют - это магические методы, речь не про саму "магию" в php, а про альтернативный синтаксис некоторых методов, например, where()

Работа с датой и временем

Ноябрь, 2023

Возможно, данная тема немного холиварна и существуют кейсы, когда рекомендация неприменима, но для большинства совет будет такой:

В backend-е всегда храни и работай с датой и временем в UTC (UTC±0).

SSH ключ для репозитория

Август, 2022

Очень часто начинающие, а иногда и "начавшие", разработчики пренебрегают способом аутентификации на своих git-репозиториях и используют соединение по https, постоянно вводя логин/пароль или вбивая его в GUI.

Передача данных в JS

Август, 2022

Вопрос «Как использовать php-переменную в js?» периодически всплывает в чатах по ларе и у фреймворка даже есть небольшой функционал для этого, поэтому рассмотрим какие могут быть способы передачи данных между backend и frontend приложениями.

Eloquent VS Facade DB

Август, 2022

Холивар

Eloquent - это мощная ORM, реализация шаблона ActiveRecord, позволяющая комфортно работать с базой данных, например, с помощью таких вещей: модели, связи, скоупы, события, аксессоры, мутаторы, касты...

Но, к сожалению, у удобства есть своя цена и в случае с Eloquent - это производительность из-за дополнительного функционала.

Репозиторий и Eloquent

Октябрь, 2023

Запрещённые слова, Холивар

Одна из самых горячих тем в чатах, которая вспыхивает по КД. Сразу подчеркну, что этот текст мои (и не только) размышления на данную тему, поэтому никаких выводов о добре и зле здесь не будет.

Логика в контроллерах это плохо?

Август, 2022

мысликсер, имхо

«Логика в контроллерах это плохо... понятненько». Мистер Маки

На данную тему есть блок в «bad-практиках» и для большинства ситуаций это действительно так, как минимум, потому что мы не сможем переиспользовать логику, которую написали в контроллере (хотя некоторые додумываются вызывать контроллеры из контроллера, как следствие полного непонимания роли контроллера в приложении).

Связка Laravel и Vue

Июль, 2024

Запрещённые слова, Холивар

Нет никакой магической связки между Laravel и Vue. Они не созданы друг для друга. Забудь навсегда этот бред.

Когда кто-либо пишет о "связке backend и frontend", то таким образом он показывает незнание основ работы web-приложений.

Vite vs Mix

Август, 2022

Согласно посту на laravel-news.com , в Laravel 9 сборщик Mix был заменён на Vite, как более быстрое и современное решение.