Laravel по-русски

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

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

#2 Re: Laravel 6/7/8/9/10 » Вопрос по Джобам » 20.03.2023 19:00:33

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

Вообще если нужна зависимость между заданиями т.е. второе задание нужно выполнить только если первое выполнилось, то это можно указать через цепочки - https://laravel.com/docs/10.x/queues#job-chaining

#3 Re: Laravel 6/7/8/9/10 » Многопоточность, кто сталкивался? » 06.03.2023 17:28:30

Думаю сделать это очередями Laravel, но боюсь за скорость ответа.

Скорость ответа тут подразумевается, чтобы уложится в стандартные 30 сек. на запрос или что?

Вообще я бы ответ получал через websocket. Например перешли на страницу где надо выводит ответ/результат парсеров, в очередь кинулись несколько задании на парсинг и слушатели, после того как выполнили через websocket отдали бы ответ/результат парсинга на фронт. А тем временем на странице какой-нибудь loading... с сообщением, что идет обработка.

Ну а скорость обработки будет зависит:

  1. От того как часто проверяет слушатель наличие задании в очереди, есть такой параметр sleep, что-ли, он по умолчанию 1, т.е. слушатель засыпает на секунду, таким образом снижается нагрузка на железо, но если надо как можно быстрее преступить к обработки и есть ресурсы можно поставить 0.

  2. И от кол-ва слушателей и распределения между ними задании, например у тебя есть 10 задании, а слушателей только 5, соответственно 5 сразу начнут обрабатываться, а следующие по освобождению. А вот если 10 заданий и 10 слушателей, то все параллельно начнут выполнятся. Но тут тоже есть параметры, которые надо подстроить, чтобы один слушатель не забрал себе все задания, а остальные простаивали бы.

#4 Re: Laravel 6/7/8/9/10 » Выборка из нескольких таблиц » 17.04.2022 15:04:53

Надо еще прочитать как делаются связи — eloquent-relationships.
Надо при выборке указать, что нужно достать модель со связью otdName

PHP
$listOrg ListTech::with('otdName')->where('inv_num'$inv)->get();
$listOrg->otdName->name// Тут будет имя

#5 Re: Laravel 6/7/8/9/10 » Ярлык storage превращается в обычную папку laravel 8 » 17.04.2022 14:57:52

Возможно у Вас разные версии php локально и на хостинге, проверьте это

#6 Re: Laravel 6/7/8/9/10 » Вывод товаров категорий » 17.04.2022 14:52:34

Надо смотреть структуру БД.

А вообще надо менять products() — это описание связи «один ко многим» и тут опушены указание полей в таблицах, т.к. их название совпадают с названиями по умолчанию. Т.е. мы можем products() записать так:

PHP
    public function products()
    {
        return 
$this->hasMany(Product::class, 'category_id''id');
    }

Т.е. в таблице с товарами есть колонка category_id в ней id категории к которой относится товар. Т.е. нам надо указать id категории не только родительской, но всех дочерних категории.

Я бы начал решать эту задачу с SQL запроса, т.е. какой должен получится запрос. Если появится понимание на уровне БД какой должен получится запрос, то и тут легче будет разобратся.

#7 Re: Laravel 6/7/8/9/10 » Не возвращать ошибки валидации если поле не required » 17.04.2022 14:33:03

Если name вообще планиурется не присылать то можно использовать правило sometimes.

PHP
public function rules()
    {
        return [
            
'name' => 'sometimes|min:2|max:25',
            
'subject' => 'sometimes|min:2|max:25',
            
'email' => 'sometimes|email',
            
'content' => 'required|min:2',
        ];
    }

Если же name постоянно будет приходит, но в случае, когда оно не нужно оно равно пустой строке или null, тогда тут подойдет правило nullable

PHP
public function rules()
    {
        return [
            
'name' => 'nullable|min:2|max:25',
            
'subject' => 'nullable|min:2|max:25',
            
'email' => 'nullable|email',
            
'content' => 'required|min:2',
        ];
    }

Ну и оф. документации для подробностей, а вообще есть еще вот хорошая статья про различия nullable и sometimes — статья

#8 Re: Laravel 6/7/8/9/10 » Как определить консольный режим » 17.04.2022 14:24:36

Вообще впринципе в php есть такая функция php_sapi_name с помощью нее можно поределить консоль это или нет. Примерно так:

PHP
if (strpos(php_sapi_name(), 'cli') !== false) {
    
// Работает в консоле
}

Может это поможет?

#9 Laravel 6/7/8/9/10 » Laravel и codeception » 29.06.2021 09:43:58

i3bepb
Ответов: 1

На чем пишите тесты? Используете какой-либо фреймворк например codeception или то, что идет из коробки с laravel?

#10 Re: Laravel 6/7/8/9/10 » Нужна помощь » 01.02.2021 15:53:26

Так вроде же есть ошибка конкретная - не существует класс App\Http\Kernel

Class App\Http\Kernel does not exist

Посмотрите существует он или нет?

А как Вы перекинули?

#11 Re: Прочее » Как Вы переводите байты в килобайты, мегабайты и т.д.? » 01.02.2021 15:48:50

@Proger_XP дак как бы Вы написали валидатор, если бы Вам поставили задачу, пропускать файл только меньше 5 Мегабайт, так:

'max:5120'

или так:

'max:5000'

#12 Прочее » Как Вы переводите байты в килобайты, мегабайты и т.д.? » 01.02.2021 09:42:35

i3bepb
Ответов: 3

Вроде как всегда было 1 Кбайт = 1024 байт, но например тот же онлайн калькулятор от google использует правило 1 Кбайт = 1000 байт, понятно, что это некий холивар, но интересно Ваше мнение, кто как делает?

#13 Re: Laravel 6/7/8/9/10 » Ошибка при запуске Twillio Chat при запуске laravel 8 приложения... » 31.01.2021 19:44:18

Тут мне кажется нужен хороший фронтендер знающий vue js, node js, т.е. тут laravel то не влияет. С моей backend-ерской точки зрения у Вас получается некий процесс на node js, который постоянно слушает ws://localhost:8081. А сам проект работал на h ttp://local-ads-backend8.com:80 или h ttp://127.0.0.1:8000, дак вот как он там на фронте узнает адрес ws://localhost:8081, может он берет основной адрес и просто добавляет порт 8081. Тогда он пытался ходить по ws://local-ads-backend8.com:8081 и ws://127.0.0.1:8081, но это не ws://localhost:8081. Может Вам попробовать запустить проект на домене localhost ?!

#14 Re: Laravel 6/7/8/9/10 » Не запускается tinker » 31.01.2021 19:28:23

А кодировка файлов проектов одинаковая? Возможно в 7 - utf-8, а в 8 - windows1251. И в 8-ке он не может норм получить часть пути, которая:

„Ґ­Ёб

Проверьте еще кодировку

#15 Re: Laravel 6/7/8/9/10 » Не запускается tinker » 31.01.2021 19:11:01

ОС windows

Еще же тот путь, что используется для записи, изначально вроде скрыть, т.е. когда заходишь в папку пользователя то не видишь папки AppData. Т.е. может тут на уровне windows какая-то защита от записи в эту папку. Я считаю не очень удачно начинать учебный проект на базе windows т.к. будете спотыкаться об нюансы, которых на "продакшн" не бывает (не слышал, что бы кто-то реальный проект запустил в OS отличной от Linux) и тратить на них время вместо изучения фреймворка.

#16 Re: Laravel 6/7/8/9/10 » Не запускается tinker » 31.01.2021 19:00:48

Попробуйте проставить папке права 777 и снова запустить tinker и если он заработает то точно дело в правах

chmod -R 777 полный_путь_до_папки

#17 Re: Laravel 6/7/8/9/10 » Как сделать полиморфную связь на одну и туже таблицу » 31.01.2021 18:57:13

Вообще я нашел решение, еще 24.01.2021. Вот тут https://laravel.com/docs/8.x/eloquent-r … phic-types есть описание как сделать типы кастомными и предлагается как вариант разместить их в App\Providers\AppServiceProvider, дак вот их можно также разместить динамически в каждый из методов thumbnail(), optimized() и .т.д. Т.е получится примерно такое:

namespace App\Models;
use Illuminate\Database\Eloquent\Relations\Relation;
class File extends Model
{

    public function thumbnail()
    {
        Relation::morphMap([
            'thumbnail' => 'App\Models\File',
        ]);
        return $this->morphToMany(
            self::class,
            'file',
            'file_file_assoc',
            'parent_id',
            'child_id',
            'id',
            'id'
        );
    }

    public function optimized()
    {
        Relation::morphMap([
            'optimized' => 'App\Models\File',
        ]);
         ...
    }
}

#18 Re: Laravel 6/7/8/9/10 » Не запускается tinker » 31.01.2021 18:46:38

а на счет прав на папку Writing to directory C:/Users/„Ґ­Ёб/AppData/Roaming/PsySH is not allowed. я так понимаю вот тут на скрине у нее полные права? Т.е. проблема не в правах? Картинка тут

На скрине видно, что на запись есть права у пользователя Denis, а для остальных нет прав на запись. Дак вот когда Вы запускаете tinker, под каким пользователем он пытается туда писать?

#19 Re: Laravel 6/7/8/9/10 » Оптимизация контроллера, помогите. » 23.01.2021 09:29:57

Тут скорее всего проблемы в медленных запросах к БД, а не в коде контроллера, глядя только на код контроллера никто ничего не подскажет, надо структуру БД, затем какие запросы получаются. А еще в коде видно использование Cache::remember т.е. тот кто его писал уже знал, что есть проблемы с быстродействием и пытался, что-то закэшировать и вот когда кэша нет все тормозит.

#20 Laravel 6/7/8/9/10 » Как сделать полиморфную связь на одну и туже таблицу » 23.01.2021 08:53:44

i3bepb
Ответов: 1

Есть 2 таблицы - таблица картинок и таблица связи картинки с картинкой.

Например заливаем картинку, делаем запись о ней в первую таблицу, затем делаем для нее thumbnail это тоже картинка пишем о ней также в первую таблицу, теперь надо знать, что на первую оригинальную картинку есть thumbnail и они связываются под средством второй таблицы. Также в дальнейшем оригинальная картинка еще может обрабатываться и на выходе получатся оптимизированный вариант, также она может перегоняться в формат pdf, т.е. получается на 1 оригинальную картинку в итоге получается несколько других связанных с оригинальной.

Таблица files

Column        |              Type              |      Description
--------------+--------------------------------+------------------------
 id           | bigint                         |
 path         | character varying(512)         | Путь до файла
 created_at   | timestamp(0) without time zone |

Таблица file_file_assoc

  Column   |          Type          |                                                     Description
-----------+------------------------+----------------------------------------------------------------------------------------------------------
 parent_id | bigint                 | id оригинального изображения
 child_id  | bigint                 | id thumbnail, оптимизированного или pdf изображения
 file_type | character varying(255) | Указывает на то чем является child_id файл по отношению к parent_id - миниатюра, склеенный pdf, оптимизированный
Indexes:
    "file_file_assoc_pkey" PRIMARY KEY, btree (parent_id, file_type)

Пример данных:

  id  |                                   path              |     created_at
------+-----------------------------------------------------+---------------------
 2015 | /api/file/20/12/14/0007/2012140007_15.jpeg          | 2021-01-22 22:38:17
 2016 | /api/file/20/12/14/0007/2012140007_01.jpeg          | 2021-01-22 23:12:55
 2022 | /api/file/20/12/14/0007/opt/2012140007_15.jpeg      | 2021-01-22 23:23:50
 2023 | /api/file/20/12/14/0007/opt/2012140007_01.jpeg      | 2021-01-22 23:27:28
 2024 | /api/file/20/12/14/0007/thumbnail/2012140007_02.jpg | 2021-01-22 23:36:30
 2025 | /api/file/20/12/14/0007/thumbnail/2012140007_03.jpg | 2021-01-22 23:42:37

 parent_id | child_id | file_type
-----------+----------+-----------
      2015 |     2022 | optimized
      2016 |     2023 | optimized
      2015 |     2024 | thumbnail
      2016 |     2025 | thumbnail

Есть модель File:

namespace App\Models;
class File extends Model
{

    public function thumbnail()
    {
        return $this->morphToMany(
            self::class,
            'file',
            'file_file_assoc',
            'parent_id',
            'child_id',
            'id',
            'id'
        );
    }

    public function optimized()
    {
         ...
    }
}

Т.е. например для картинки (id=2017) чтобы выбрать thumbnail нужен подобный запрос:

SELECT files.*
FROM file_file_assoc
    JOIN files ON files.id = file_file_assoc.child_id
WHERE file_file_assoc.parent_id = 2017 and file_file_assoc.file_type = 'thumbnail';

А для выбора optimized, тоже самое только меняется file_type.

Как мне описать relation thumbnail() и optimized(), чтобы была возможность подобного выбора миниатюр, оптимизированных вариантов и т.д. ? Т.е. как мне получить это через ORM ? Я вижу, что это похоже на https://laravel.com/docs/master/eloquen … ationships, но как конкретно это сделать!?

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