Проверить существует ли файл laravel

Обновлено: 07.07.2024

У меня есть модель Eloquent, у которой есть связанная модель:

Когда я создаю модель, она не обязательно имеет связанную модель. Когда я обновляю его, я могу добавить опцию или нет.

Поэтому мне нужно проверить, существует ли связанная модель, обновить или создать ее соответственно:

Где <related_model_exists> код, который я ищу.

Офигенный вопрос спасибо! И отличные ответы ребятам ниже. Сэкономил мне время на моем проекте.

В php 7.2+ вы не можете использовать count объект отношения, поэтому не существует универсального метода для всех отношений. Вместо этого используйте метод запроса как @tremby, представленный ниже:

универсальное решение, работающее со всеми типами отношений ( pre php 7.2 ):

Это будет работать для каждого отношения, так как динамические свойства возвращают Model или Collection . Оба реализуют ArrayAccess .

Итак, это выглядит так:

одиночные отношения: hasOne / belongsTo / morphTo / morphOne

отношения ко многим: hasMany / belongsToMany / morphMany / morphToMany / morphedByMany

Прочитайте все это. count($relation) это общее решение для всех отношений. Это будет работать Model и Collection , пока Model не имеет ->count() метода. @CurvianVynes Нет, это не так. Collection имеет свой собственный метод isEmpty , но универсальная empty функция возвращает false для объекта (поэтому не будет работать для пустой коллекции). count($model->relation) не работал, morphTo когда отношения еще не были установлены. Иностранный идентификатор и тип являются нулевыми, и запрос БД, созданный Laravel, является поддельным и вызывает исключение. Я использовал $model->relation()->getOtherKey() в качестве обходного пути. @Jocelyn Да, это красноречивая ошибка. К сожалению, есть по крайней мере несколько из них для полиморфных отношений, поэтому, очевидно, вы не можете на них полагаться. Он сломается на PHP 7.2, возвращая: count(): Parameter must be an array or an object that implements Countable

Объект Relation передает вызовы неизвестного метода в построитель запросов Eloquent , который настроен на выбор только связанных объектов. Этот Builder, в свою очередь, передает вызовы неизвестных методов своему базовому построителю запросов .

Это означает, что вы можете использовать методы exists() или count() напрямую из объекта отношения:

Обратите внимание на круглые скобки после relation : ->relation() это вызов функции (получение объекта отношения), в отличие от ->relation которого Laravel установил для вас средство получения магического свойства (получение связанного объекта / объектов).

Использование count метода для объекта отношения (то есть использование скобок) будет намного быстрее, чем выполнение $model->relation->count() или count($model->relation) (если отношение не было уже загружено), поскольку он выполняет запрос подсчета, а не извлекает все данные для любых связанных объектов из базы данных, просто посчитать их. Аналогично, использование exists не требует извлечения данных модели.

Как exists() и count() работа на всех типах реляционных я пробовал, так что, по крайней мере belongsTo , hasOne , hasMany и belongsToMany .

Можно ли проверить в виде Блейда, есть ли у @yield контент или нет?

Я пытаюсь присвоить заголовки страниц в представлениях:

Поэтому я хотел бы проверить основной вид макета. что-то вроде:

Ответы - Laravel-проверьте, является ли @yield пустым или нет / Laravel - Check if @yield empty or not

Lucky Soni

почему бы не передать заголовок в качестве переменной View::make('home')->with('title', 'Your Title') это сделает ваш заголовок доступным в $title

Antonio Carlos Ribeiro

Я не думаю, что вы можете, но у вас есть варианты, например, использовать view composer, чтобы всегда предоставлять $title для ваших представлений:

Erin Drummond

А ты не можешь этого сделать:

<title> Sitename.com @section("title") Default @show </title>

И в субшаблон который будет использоваться.лезвие.РНР:

Robert Brisita

Способ проверки заключается в том, чтобы не использовать ярлык"@", а использовать длинную форму: раздел.

Collin James

Вероятно, есть более красивый способ сделать это. Но это делает свое дело.

passioncoder

Вы можете просто проверить, существует ли этот раздел:

Pathros

Дано из документов:

Введите в свой основной макет, например, " приложение.лезвие.на PHP", "основной.лезвие.php", или " мастер.лезвие.РНР"

А на конкретной странице просмотра (блейд-файл) введите следующее:

Jonathan

Основываясь на ответе Колина Джейма, если это не очевидно, я бы рекомендовал что-то вроде этого:

cborgia

В Laravel 5 Теперь у нас есть метод hasSection , который мы можем вызвать на фасаде View .

Вы можете использовать View::hasSection , чтобы проверить, является ли @yeild пустым или нет:

Это условное условие проверяет, был ли установлен раздел с именем заголовка в нашем представлении.

Совет : я вижу, что многие новые ремесленники создают свои титульные разделы вот так:

но вы можете упростить это, просто передав значение по умолчанию в качестве второго аргумента:

Ответы - как проверить, существует ли каталог с Storage:: facade в laravel? / how to check if directory exists with Storage:: facade in laravel?

prava

Alexey Mezenin

Если вы хотите проверить наличие каталога, попробуйте сделать это:

omarjebari

Вы можете получить все каталоги в виде массива, а затем проверить, есть ли там каталог (путь).

Tjeu Moonen

vmars

в laravel 5.4 $exists = Storage::disk('public')->exists('images/test_image.jpg'); - с 'public' , который был сконфигурирован в filesystem.php

'images/test_image.jpg' - это путь изображения.

Jason

Есть две вещи, которые нужно проверить: (1) что путь существует, и (2) что путь является каталогом.

Это позволит проверить наличие пути (синтаксис для Laravel 5.2+), независимо от того, является ли он файлом или каталогом:

Как только вы узнаете, что он существует, это подтвердит, что путь является каталогом:

Базовая библиотека Flysystem будет кэшировать все, что может, при проверке файловой системы (которая может быть локальной или удаленной), поэтому в нормальных условиях эти две функции будут делать только один вызов файловой системы.

Prateek

Если вы хотите проверить, существует ли каталог, и создать его, если он не существует, этот код будет работать для вас.

Mohammad Shoriful Islam Ronju

Ну, вы можете легко сделать это через файловый фасад File::isDirectory($YOURDIRECTORYPATHHERE); , который вернет логическое значение, основанное на существовании!

gjerich

Еще один способ для laravel 5.5-использование фасада хранилища.

Shunhra Sarker

Mostafa Talebi

Вы можете легко использовать Storage::isDirectory() . Storage::class -это экземпляр \Illuminate\Filesystem\Filesystem , и он содержит метод isDirectory для проверки того, существует ли данный путь и является ли он каталогом или нет.


Содержание

  • Понимание того, как Laravel обрабатывает файлы
  • Загрузка файлов в Laravel
  • Разница между локальными и общедоступными дисками
  • Загрузка нескольких файлов
  • Проверка загрузки файлов
  • Перемещение файлов в облако
  • Отправка файлов в виде вложений электронной почты
  • Фасад хранилища для файлов, когда файлы Уже существует
  • Управление файлами
  • Не забывайте каталоги
  • Заключение

Затем в welcome.blade. php обновите тег заголовка на:

Измените содержимое тела на:

Для формы загрузки файла enctype = "multipart/form-data " и method =" POST " чрезвычайно важны, поскольку браузер знает, как правильно форматировать запрос. > является специфичным для Laravel и генерирует скрытое поле ввода с токеном, который Laravel может использовать для проверки правильности отправки формы.

Если токен CSRF не существует на странице, Laravel покажет страницу «Срок действия страницы истек из-за неактивности».


Теперь, когда у нас есть наши зависимости, давайте приступим.

Понимание того, как Laravel обрабатывает файлы

Развитие в том виде, в каком мы его знаем в 2018 году, быстро растет, и в большинстве случаев существует множество решений одной проблемы. Возьмем, к примеру, файловый хостинг: теперь у нас так много вариантов для хранения файлов, огромное количество решений, начиная от собственного хостинга и заканчивая FTP, облачным хранилищем и GFS и многими другими.

Загрузка файлов в Laravel

Из введенного выше раздела у нас есть форма с вводом файла, готовая к обработке . Мы видим, что форма указывает на/process. В routes/web.php мы определяем новый маршрут POST/process.

Если вам не нравится шаблон именования по умолчанию, предоставляемый Laravel, вы можете предоставить свой с помощью метода storeAs.

Разница между локальными и общедоступными дисками

В config/filesystems.php вы можете увидеть определены диски локальные и публичные. По умолчанию Laravel использует конфигурацию локального диска. Основное различие между локальным и общедоступным дисками заключается в том, что локальный диск является частным, и к нему нельзя получить доступ из браузера, в то время как общедоступный может быть доступен из браузера.

Поскольку общий диск находится в хранилище/app/public и Корень сервера Laravel находится в открытом доступе, вам нужно связать storage/app/public с общей папкой Laravel. Мы можем сделать это с помощью нашего верного мастера, запустив php artisan storage: link.

Загрузка нескольких файлов

Поскольку Laravel не предоставляет функции для загрузки нескольких файлов, нам нужно сделать это самим. Это не сильно отличается от того, что мы делали до сих пор, нам просто нужен цикл.

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

После запуска я получил следующий массив, так как я загрузил GIF и PNG:

Проверка загрузки файлов

Есть много способов проверить файлы в Laravel, но давайте остановимся на проверке контроллера.

Для приведенного выше фрагмента мы сказали Laravel убедиться, что поле с именем фотографии является обязательным, это успешно загруженный файл, image, он имеет один из определенных типов mime, и его максимальный размер составляет 2048 килобайт

Теперь, когда злонамеренный пользователь загружает замаскированный файл, файл не пройдет проверку, и если по какой-то странной причине вы оставляете cgi.fix_pathinfo включенным, это не средство, с помощью которого вы можете получить PWNED .

Если вы перейдете на страницу проверки Laravel, вы увидите целую кучу правила проверки.

Перенос файлов в облако

Итак, ваш сайт стал взрослым, на нем много посетителей, и вы решили, что пора перейти в облако. Или, может быть, с самого начала вы решили, что ваши файлы будут храниться на отдельном сервере. Хорошая новость заключается в том, что Laravel поддерживает множество облачных провайдеров, но в этом руководстве мы будем использовать Amazon.

Ранее мы установили league/flysystem-aws-s3-v3 через composer. Laravel будет автоматически искать его, если вы решите использовать Amazon S3 или выбросите исключение.

Чтобы загрузить файлы в облако, просто используйте:

Для загрузки нескольких файлов:

Пользователи, возможно, уже загрузили файлы, прежде чем вы решите переключиться на облачного провайдера, вы можете проверить следующие разделы, чтобы узнать, что делать, если файлы уже существуют.

Примечание: вам нужно будет настроить свои учетные данные Amazon s3 в config/filesystems.php ** . **

Отправка файлов в виде вложений электронной почты

Прежде чем мы это сделаем, давайте быстро настроим наши почтовая среда. В файле .env вы увидите этот раздел

Нам нужны имя пользователя и пароль, которые мы можем получить на Mailtrap.io. Mailtrap действительно хорош для тестирования электронной почты во время разработки, поскольку вам не нужно забивать электронную почту спамом. Вы также можете предоставить общий доступ к почтовым ящикам для членов команды или создать отдельные почтовые ящики.

Сначала создайте учетную запись и войдите в систему:

После копирования учетных данных мы можем изменить .env на:

Не пытайтесь использовать мой, я удалил его.

Создайте свой почтовый ящик

Затем отредактируйте его метод сборки и измените его на:

Как видно из приведенного выше метода, мы передаем абсолютный путь к файлу методу attach () и передаем необязательный массив, где re мы можем изменить имя вложения или даже добавить собственные заголовки. Затем нам нужно создать представление электронной почты.

Создайте новый файл представления в resources/views/emails/files_downloaded.blade.php и поместите его содержимое ниже.

Теперь в routes/web.php мы можем создать новый маршрут и отправлять почту при посещении.

Если вы перейдете в Mailtrap, вы должны это увидеть.


Фасад хранилища для случаев, когда файлы уже существуют

В приложении мы не каждый раз обрабатываем файлы посредством загрузки. Иногда мы решаем отложить облачный файл загружается до тех пор, пока не будет выполнено определенное действие пользователя. В других случаях у нас есть некоторые файлы на диске перед переключением на облачного провайдера. Для таких случаев Laravel предоставляет удобный фасад хранилища. Для тех, кто не знает, фасады в Laravel являются псевдонимами классов .Поэтому вместо того, чтобы делать что-то вроде Symfony File Whatever Long Namespace UploadedFile, мы можем вместо этого сделать Storage.

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

использовать облачного провайдера по умолчанию

Создать новый файл с содержимым

Prepend to file

Добавить в файл

Получить содержимое файла

Проверить, существует ли файл

Принудительная загрузка файла

Создание общедоступного URL

Создать временный общедоступный URL-адрес (т.е. файлы, которые не будут существовать по прошествии установленного времени). Это будет работать только для облачных провайдеров, поскольку Laravel еще не знает, как обрабатывать создание временных URL-адресов для локального диска.

Получить размер файла

Дата последнего изменения

Управление файлами

Изменение размера изображений, добавление фильтров и т. Д. Вот где Laravel нужна внешняя помощь. Добавление этой функции в Laravel только приведет к раздуванию приложения, поскольку оно не требуется для установки. Нам нужен пакет под названием «вмешательство/изображение». Мы уже установили этот пакет, но для справки.

Поскольку Laravel может автоматически обнаруживать пакеты, нам не нужно ничего регистрировать. Если вы используете версию Laravel ниже 5.5, прочтите это.

Чтобы изменить размер изображения

Даже пакеты Laravel работают свободно.

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

Не забывайте каталоги

Laravel также предоставляет удобных помощников для работа с каталогами. Все они основаны на итераторах PHP, поэтому обеспечивают максимальную производительность.

Чтобы получить все файлы:

Чтобы получить все файлы в каталоге, включая файлы в подпапках

Чтобы получить все каталоги внутри каталога

Чтобы получить все каталоги в каталоге, включая файлы в подкаталогах

Заключение

Если мы что-то упустили, сообщите нам вниз в комментариях. Кроме того, проверьте Mailtrap, они действительно хороши и помогут вам пройти этап разработки в отношении отладки электронных писем.

Читайте также: