Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 Laravel 5.x » Как правильно запустить очередь, в которой используются имена очереди? » 13.04.2021 15:54:27

xintrea
Ответов: 0

Восстанавливаю сейчас к работе проект двухлетней давности.

В нем используется Laravel 5.5.45.

Проблема вот в чем. Очереди в проекте настроены на драйвер database, используется MySQL (MariaDB). Таблицы jobs и failed_jobs созданы. Задания очереди успешно создаются, и появляются в таблице jobs. Для заданий предусмотрено 3 очереди:

- email
- phone
- telegram

В таблице jobs в поле queue видно соответствующее имя очереди.

Если согласно документации запустить очередь командой:

php artisan queue:work

то задания выполняться не будут, и поле attempt (количество попыток запуска) для всех заданий будет содержать значение 0.

В какой-то момент я нащупал, что если запустить команду:

php artisan queue:work --queue=telegram,default

то задания из очереди telegram таки выполнятся.

Но в документации я не нашел описания того, что для работы обработчика очереди требуется обязательно указывать имя очереди. Вроде как команда php artisan queue:work должна обрабатывать все очереди, но этого не происходит.

Вопрос: а какой командой таки можно запустить обработку всех именованных очередей? Я ее пропишу в Supervisor.

#2 Laravel 5.x » Как добавить стандартный JQuery Datepicker в Laravel 5.5? » 29.08.2019 20:32:37

xintrea
Ответов: 0

Пытаюсь добавить стандартный JQuery Datepicker в Laravel 5.5.

Делаю все действия вот по этой статье:

https://medium.com/@Oriechinedu/how-to- … 5bf0244fc1

Сбрасываю все кеши, не забываю про npm run dev.

В коде пишу:

<input type="text" class="datepicker" id="dateFrom" name="dateFrom" />
<input type="text" class="datepicker" id="dateTo" name="dateTo" />

В результате при клике на даты ничего не происходит.

Проверяю сгенерированный /public/js/app.js, в нем вижу, что вставлен компонент datepicker, и вижу что строка

$('.datepicker').datepicker();

превратилась в

jquery__WEBPACK_IMPORTED_MODULE_0___default()('.datepicker').datepicker();

То есть, вроде как класс должен обрабатываться и обработчик должен прилепляться. Но этого не происходит. Где что еще нужно крутануть?

#3 Laravel 5.x » Выборка записей по времени в Laravel - не работает » 07.05.2019 14:42:33

xintrea
Ответов: 2

Имею SQL-базу MariaDB Ver 15.1 Distrib 10.1.37-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2.

Есть таблица с полями:

- is_use (тип boolean)
- created_at (стандартное поле timestamp)

Пытаюсь найти в таблице записи, у которых поле is_use=false и время создания более 2-х часов от текущего момента.

Делаю такой запрос:

$result=Article::where('is_use', false)->where('created_at', '<', '(NOW() - INTERVAL 2 HOUR)')->get();
            
info("Garbage collector for Article is run: ".$result." count ".count($result));

В результате записи не находятся:

Garbage collector for Article is run: [] count 0

Хотя такие записи однозначно есть.

Информация о сконструированном SQL-запросе следующая:

{"query":"select * from `articles` where `is_use` = ? and `created_at` < ?","bindings":[false,"(NOW() - INTERVAL 2 HOUR)"],"time":0.95}

И по-ходу дела запрос получается такой:

select * from `articles` where `is_use` = false and `created_at` < "(NOW() - INTERVAL 2 HOUR)";

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

Но как заставить Eloquent конструировать запрос с выражением времени так, чтобы это выражение не помещалось в кавычки?

#4 Laravel 5.x » Редактор текста в Laravel с картинками и прикрепляемыми файлами » 06.05.2019 10:52:22

xintrea
Ответов: 0

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

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

И я не могу найти готовое решение.

Пока планирую такой путь: взять для редактирования какой-нибудь WYSIWIG-редактор типа TinyMCE или Summernote. Главное чтоб у этого редактора была возможность создания кастомных кнопок. Сделать кнопку, по которой будет вызываться контроллер, который создаст директорию с id записи (если таковой директории нет), а затем откроет какой-нибудь визуальный файловый менеджер (какой?), который натравлен на данную директорию.

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

В связи с чем вопросы:

1. Существует ли похожее готовое решение? (laravel 5.5)
2. Какой редактор выбрать?
3. Какой файловый менеджер выбрать?

#5 Laravel 5.x » Как работает onQueue() в очередях Laravel? » 23.04.2019 10:26:10

xintrea
Ответов: 0

Что-то читаю документацию, и не могу понять.

При помещении задачи в очередь, можно через метод onQueue('queueName') указать текстовый идентификатор очереди. Но нигде не написано, где эти идентификаторы задаются/настраиваются.

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

#6 Re: Laravel 5.x » Можно ли через очередь Laravel заблокировать отправку частых событий? » 19.04.2019 16:41:46

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

Да, для каждого посетителя отслеживать отдельно. Авторизация есть.

То есть, все-таки механизмом очереди такое не разрулить, и нужно делать таблицу с запоминанием времени отправки тестового сообщения?

#7 Re: Laravel 5.x » Отношения между таблицами через строку с id » 19.04.2019 14:27:02

Ты для поля card_id используешь строку с id, разделенными запятыми?

Это прямое нарушение принципов нормировки баз данных. Ты же с таким подходом не сможешь толком индексировать столбцы, чтобы быстро находить связанные записи. Тут однозначно в таблице names надо убирать столбец card_id, и вводить еще одну таблицу, например user_cards, со солбцами name_id и card_id. И она будет связывать таблицы names и cards.

#8 Laravel 5.x » Можно ли через очередь Laravel заблокировать отправку частых событий? » 19.04.2019 14:19:37

xintrea
Ответов: 3

Laravel 5.5, очередь на MySQL.

В интерфейсе сайта есть кнопка «Тестовое сообщение». Когда она нажимается, должно запускаться определенное Job-действие, которое помещается в очередь.

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

Вопрос: есть ли возможность в очереди Laravel отслеживать по таким критериям отправку сообщений? Или нужно просто заводить таблицу, в которой хранить последний момент помещения действия в очередь и сравнивать с ним?

#9 Laravel 5.x » Запуск Validator чтобы он повторно вызывал запрос со старыми данными » 16.04.2019 11:58:38

xintrea
Ответов: 1

Laravel 5.5

Для проверки ввода я пытаюсь использовать такой код:

public function addNotifyChannelApply(Request $request) {

  // Правила валидации
  $validator = Validator::make($request->all(), [
              'channelTypeId' => 'required|integer',
              'notifyChannelValue' => 'required|regex:/^(\d{4})$/',
          ]);

  // Дополнительная проверка
  $validator->after(function ($validator) use ($channelTypeId, $channelValue) {
    // Тут всякий проверяющий код            
  });
        
  // Запуск валидации на проверку
  $validator->validate();
  ...

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

В результате контроллер отрабатывает неправильно, потому что не получает нужные Request-данные, они теряются.

Вроде как можно использовать конструкцию withInput( Array ), но у инстанса объекта Validator нет такого метода. Поэтому попробовал вместо $validator->validate(); написать:

if ($validator->fails()) {
  return redirect()->back()->withInput($request->all());
}

Но и так, все равно, данные предыдущего Request не приходят в метод контроллера. Сижу и думаю, почему так.

(!) Единственное, что я заметил, так это то, что повторный запрос, генерируемый валидатором, почему-то приходит через метод GET. И у этого запроса, естественно, нет раздела Form Data, в котором были бы видны повторно передаваемые данные формы. Видимо из-за этого теряются переменные POST.

Начал искать, с какого перепугу Validator генерирует GET-запрос вместо POST, ничего не нахожу.

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

#10 Laravel 5.x » Как ориентироваться в документации на Laravel API? » 11.04.2019 11:20:19

xintrea
Ответов: 2

Использую Laravel 5.5

Мне надо посмотреть, например, что возвращает метод Модели create().

Саму модель я наследую от Illuminate\Database\Eloquent\Model, значит лезу в документацию вот сюда:

https://laravel.com/api/5.5/Illuminate/ … Model.html

И метода create() я там не нахожу.

Вопрос: где искать описание этого метода?

#11 Laravel 5.x » Как в Laravel получить из таблицы-справочника массив с id=>name ? » 09.04.2019 15:17:07

xintrea
Ответов: 2

Есть таблица, у которой есть поля id и name, ее содержимое, например, такое:

id name
1 name1
5 name5
7 name7

Есть ли какой-нибудь метод, чтобы одним махом получить ассоциативный массив вида:

[ 1=>'name1', 5=>'name5', 7=>'name7' ]

?

#12 Laravel 5.x » Как в миграции Laravel объявить столбец с атрибутом уникальности? » 08.04.2019 11:19:27

xintrea
Ответов: 1

База MySQL. Читаю документацию, и не могу понять: каким образом в миграции Laravel можно создать поле так, чтобы оно имело атрибут Unique?

Если делать так:

$table->string('text_id', 16)->unique();

То создастся обычное поле, и для него будет сделан уникальный индекс. Но само поле не получит атрибут уникальности.

А как сделать именно поле с атрибутом уникальности?

UPD: Понял, протормозил. Атрибута уникальности в MySQL нет как понятия. Уникального индекса достаточно.

#13 Re: Веб-разработка » Почему <div> имеет размер меньше, чем его содержимое? (С видео) » 04.04.2019 11:35:57

Такова природа вещей. Это надо принять и запомнить: плавающий блок выпадает из потока. Приходится предпринимать специальные усилия чтобы обволакивать его.

Так в том-то и дело, что внутри блока находятся как inline-блоки (label) так и обычные блоки (само поле ввода). И тем не менее окружающий блок имеет высоту ноль.

#14 Re: Веб-разработка » Почему <div> имеет размер меньше, чем его содержимое? (С видео) » 04.04.2019 11:05:28

Дело было в том, что форме я забыл назначить класс form-horizontal.

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

#15 Веб-разработка » Почему <div> имеет размер меньше, чем его содержимое? (С видео) » 03.04.2019 19:34:35

xintrea
Ответов: 6

У меня версточный кретинизм. В связи с чем возник вопрос.

Используется Bootstrap 3. Есть такой код (блок-контейнер, естественно, есть, но не показан):

...
<div class="row">
    <div class="col-xs-12 col-xs-offset-0">

        <!-- Логин -->
        <div class="form-group">
            <label for="email" class="col-md-4 control-label">Логин</label>

            <div class="col-md-6">
                <input id="name" type="text" class="form-control" ...>
            </div>
        </div>

        <!-- Пароль -->
        <div class="form-group">
            <label for="password" class="col-md-4 control-label">Пароль</label>

            <div class="col-md-6">
                <input id="password" type="password" class="form-control" ...>
            </div>
        </div>
...

Проблема в том, что блок(и) с классом form-group имеет размер 510x0, несмотря на то, что внутри него размещены элементы совсем не нулевых размеров по вертикали.

Видео: https://www.youtube.com/watch?v=LD_lK_UrsVg

Вопрос: почему так происходит? Как исправить? Ведь мне нужно чтобы между полями ввода был отступ (который подсвечивается желто-розовым цветом). И он есть, но только болтается сверху из-за того, что высота блока нулевая. А нужно, чтоб блок был размером с его содержимое.

UPD:
На всякий случай, полный код страницы: https://pastebin.com/CJtHAyGK

#16 Re: Laravel 5.x » Отправка писем из Laravel с помощью SMTP через yandex.ru » 03.04.2019 16:19:08

Ага, я наконец нашел такое же решение тут: https://toster.ru/q/302144

В итоге настройки стали такими:

MAIL_DRIVER=smtp
MAIL_HOST=smtp.yandex.ru
MAIL_PORT=587
MAIL_USERNAME=sample@yandex.ru
MAIL_PASSWORD=somePassword
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=sample@yandex.ru
MAIL_FROM_NAME=sample

Самое интересное, что не работает с портом 465, хотя с ним я проверяю работу через ssmtp, и там работает. Объяснения этому у меня нет. Прямо магия какая-то творится в компьютерных науках.

#17 Re: Laravel 5.x » Отправка писем из Laravel с помощью SMTP через yandex.ru » 03.04.2019 15:59:14

Так я же написал:

587, ssl:
Swift_TransportException
Connection could not be established with host smtp.yandex.ru [ #0]

587, tls:
Swift_TransportException (553)
Expected response code 250 but got code "553", with message "553 5.7.1 Sender address rejected: not owned by auth user. "

Не работает 587 порт.

Но еще не понятно, почему драйвер MAIL_DRIVER=mail работать не хочет, хотя простой тестовый PHP-код письмо отправляет.

#18 Laravel 5.x » Отправка писем из Laravel с помощью SMTP через yandex.ru » 03.04.2019 15:18:00

xintrea
Ответов: 5

Для теста настроил в системе программу ssmtp, чтобы проверить как будет уходить почта через почтовый сервер yandex.ru. Настройки следующие:

root=***@yandex.ru
mailhub=smtp.yandex.ru:465
rewriteDomain=yandex.ru
hostname=yandex.ru
AuthUser=***
AuthPass=***
UseTLS=YES

И с этими настройками почта отправляется.

Теперь пробую использовать такие же настройки в Laravel. В файле .env прописано:

MAIL_DRIVER=smtp
MAIL_HOST=smtp.yandex.ru
MAIL_PORT=465
MAIL_USERNAME=***
MAIL_PASSWORD=***
MAIL_ENCRYPTION=tls

Однако, при отправке почты происходит ошибка:

Swift_TransportException
Connection to tcp://smtp.yandex.ru:465 Timed Out

Я пробовал другие комбинации порта и шифрования, но они тоже не работают:

465, ssl:
Swift_TransportException (553)
Expected response code 250 but got code "553", with message "553 5.7.1 Sender address rejected: not owned by auth user. "

587, ssl:
Swift_TransportException
Connection could not be established with host smtp.yandex.ru [ #0]

587, tls:
Swift_TransportException (553)
Expected response code 250 but got code "553", with message "553 5.7.1 Sender address rejected: not owned by auth user. "

Вопрос. Как заставить работать почту в Laravel через smtp?


UPD: Еще я пробовал поставить такую настройку:

MAIL_DRIVER=mail

Все остальные значения MAIL_* приравнял null. Сделал я это
в надежде, что стработает PHP-шная функция mail(), которая у меня работает с помощью настроенного ssmtp. Например, такой код работает:

<?php 
mail("sample@gmail.com", "Отправка через SSMTP агента", "Это проверка отправки"); 
?>

Но после этой настройки и сброса кеша настроек:

$ ./artisan config:cache
Configuration cache cleared!
Configuration cached successfully!

Попытка отправки почты завершается ошибкой:

Swift_TransportException
Expected response code 220 but got an empty response

Подвал раздела