• Пустить трафик через контейнер Docker (wireguard)?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    Да - это реально, маршрутизация или маршрутизация + iptables NAT в руки и всё получится.
    Ответ написан
    Комментировать
  • Как правильно делать запросы в цикле?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    it depends

    • если запросы зависимые, то в цикле
    • если запросы можно выполнить "параллельно", то можно асинхронно сделать сразу все 4 запроса и подождать самый медленный


    например через multi curl, тогда все 4 запроса будут выполняться за время самого медленного из них, а не за сумму времени, удобно через Guzzle Async

    $promise1 = $client->getAsync('http://www.example.com/foo1');
    $promise2 = $client->getAsync('http://www.example.com/foo2');
    $promise3 = $client->getAsync('http://www.example.com/foo3');
    $promises = [$promise1, $promise2, $promise3];
    
    $results = GuzzleHttp\Promise\settle($promises)->wait(); // тут все результаты


    в обоих случаях не понятно, зачем таймаут, тк синхронно второй запрос начнется только ПОСЛЕ выполнения предыдущего, а в асинхронном варианте они просто выполнятся "одновременно" и вы получите результат сразу от всех запросов... таймаут ни к селу ни к городу
    Ответ написан
    1 комментарий
  • Обычные vs полиморфные отношения, какие выбрать?

    @jazzus
    Конечно полиморфные. А если 15 сущностей имеют картинку (что запросто может быть) - 15 айдишников прописывать в images, затем 15 belongsTo отношений в модели? Не лучшая идея. Удобней трейт HasImage с отношением morphOne image, подключенный у всех моделей. Единственная "сложность" это контролировать удаление картинки при удалении модели, но тебе итак нужно удалять картинку, как минимум с диска. Зацепить при этом модель одна строчка. В том же трейте HasImage прописал один раз логику в методе deleteImage и там this->image->delete, а сам метод вызывать в обсервере у модели при удалении. И всякие сервисные методы типа получения ссылки на изображение и т.д. Все в одном трейте. Сэкономлена тонна кода. Только в случае картинок я бы сразу сделал много картинок у сущности т.е. morphMany, что не помешает тебе брать одну. Т.к. где morphMany images может быть и morphOne image. А лучше вообще одну таблицу файлов т.к. какая разница какие файлы картинки это или документы - у всех одна логика загрузки, удаления и тд.
    Ответ написан
    1 комментарий
  • Обычные vs полиморфные отношения, какие выбрать?

    Adamos
    @Adamos
    Ну, если разобраться...
    Что такое обычные отношения? Вот у поста есть id, а у фотки есть post_id. Так она приколочена к этому посту.
    Что такое полиморфные отношения? Вот у поста есть id и у коммента есть id, а у фотки есть morph_id - в котором хранится, внезапно, все то же значение id поста или коммента, которому она принадлежит. Только, чтобы разобраться, к кому именно, хранится еще и morph_type, в котором прописано, например, имя модели, которая по этой связи будет обращаться: "App\Models\Post" или "App\Models\PostComment".

    Довольно очевидно, что если иерархия линейная - есть категории, в них посты, у них фотки - то и разводить полиморфизм тут просто негде.
    Ответ написан
    Комментировать
  • Обычные vs полиморфные отношения, какие выбрать?

    Sanes
    @Sanes
    Если устраивают обычные отношения, лучше использовать их. Полиморфные работают только магией laravel. Обычные на уровне базы данных. С другой стороны вам при удалении сущности надо удалять файл. И тут уже без laravel не обойтись.
    Ответ написан
    Комментировать
  • Как получить символы с конца строки до точки?

    @WAR_VIK
    Можно вот так:
    let print = s => console.log(s);
    let str = 'word.wor6d_word.word-a';
    let res = str.replace(/.+\./g, '');
    print(res);
    Ответ написан
    Комментировать
  • Как получить символы с конца строки до точки?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    /\.([^.]*)$/
    /([^.]*)$/
    Ответ написан
    3 комментария
  • Как передать данные в root template (inertia)?

    @arti39
    В Inertia.js, данные можно передать в root template (blade файл) с помощью двух переменных: page.props и page.asset.

    Переменная page.props содержит объект, который будет преобразован в JSON и передан внутрь JS-функции Inertia.merge. Эта функция обновляет существующие данные на странице с помощью переданных данных.

    Например, чтобы передать данные о пользователе в root template, можно выполнить следующий код в контроллере:

    public function index()
    {
        $user = Auth::user();
    
        return Inertia::render('Home', [
            'user' => $user
        ]);
    }

    Затем в blade-шаблоне можно использовать переданные данные следующим образом:

    <!DOCTYPE html>
    <html>
        <head>
            <!-- ... -->
        </head>
        <body>
            @inertia
    
            <script>
                // Объект пользователя, переданный из контроллера
                const user = @json($page.props.user);
            </script>
        </body>
    </html>

    Переменная page.asset используется для передачи пути к JS-файлу, который должен быть загружен на страницу. Этот путь должен быть относительным пути к файлу из директории public, например:

    return Inertia::render('Home', [
        'user' => $user,
        'asset' => 'js/app.js'
    ]);
    Ответ написан
    Комментировать
  • Стоит ли использовать phpdoc для описания методов, если я использую тайпхинт и указываю возвращаемые значения?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    IMHO, там где понятно по тайпхинтам, смысла в phpdoc нету. А вот там где непонятно
    /**
     * @return array{uid: string, name: string, isAdmin: bool}
     * @throws AuthenticationException on authentication error
     */
    private static function authenticate(string $login, string $password): array
    {
    }
    Ответ написан
    Комментировать
  • VUE3 как вставить js со своими параметрами полученые с пхп?

    pLavrenov
    @pLavrenov
    Разработка сайтов
    передавать как json props
    <Head title="JS" myVarJs="<?php echo json_decode($data_array) ?>"/>
    Ответ написан
    Комментировать
  • Как передать загруженный файл внутри класса, из одного метода в другой?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Для начала нужно понять что это за методы.

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

    Если один метод вызывается из другого, то ссылку на файл можно сохранить в свойстве класса $this->file или передавать параметром.
    Ответ написан
    3 комментария
  • Как правильно настроить доступ к локальной сети через wireguard?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    Нужно обеспечить маршрутизацию и прохождение трафика на всем пути следования этого трафика. Так как wireguard не умеет управлять таблицамми маршрутизации на сервере и клиенте - то потребуется настройка маршрутизации на всех хостах, начиная с клиента wireguard, продолжая сервером wireguard и заканчивая всеми хостами в локальной сети, куда нужен доступ.
    Альтернативой может быть использование NAT на сервере wireguard.
    Ответ написан
    2 комментария
  • Как сделать html-разметку в телеграм-боте?

    Sanasol
    @Sanasol
    нельзя просто так взять и загуглить ошибку
    Комментировать
  • Что такое артефакты в Gitlab?

    @Akela_wolf
    Extreme Programmer
    Нет. Артефакт - это общее название любого файла, полученного в результате сборки. Это может быть собственно результат сборки (jar или exe), отчет о тестах, сгенерированные данные и т.д. Иначе говоря, артефакт - это нечто материальное, то что не исчезает после окончания пайплайна (в отличие от временных файлов, которые удаляются по окончании процесса)
    Ответ написан
    2 комментария
  • Как вывести значения из бд в зависимости от даты?

    iMedved2009
    @iMedved2009
    Не люблю людей
    Внезапно для такого достаточно документации.
    $items = User::when($request->get('login'), function($query, $login){ $query->where('login', $login) })
                    ->when($request->get('date_start'), function($query, $date_start){ $query->where('date_start', '>=', $date_start) })
                    ->when($request->get('date_end'), function($query, $date_end){ $query->where('date_end', '<=', $date_end) })
                    ->get();
    Ответ написан
    Комментировать
  • Как написать этот код на Laravel?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    А что этот код делает? Достает список аэропортов города?

    1. Создать таблицы cities и airports (обратите внимание – названия во мн. числе)
    cities:
    id | name | другие поля, если нужно
    airports:
    id | city_id | name | другие поля, если нужно

    2. Создать модели City и Airport (обратите внимание – названия в ед. числе)

    2.1 В модели City создать отношение один-ко-многим (в городе может быть несколько аэропортов)

    public function airports(): \Illuminate\Database\Eloquent\Relations\HasMany {}
        return $this->hasMany(\App\Models\Airport::class);
    }


    2.2 В модели Airport создать обратное отношение

    public function city(): \Illuminate\Database\Eloquent\Relations\BelongsTo {}
        return $this->belongsTo(\App\Models\City::class);
    }


    Теперь можно получать аэропорты города, и город по аэропорту

    $from = $request->input['otkuda'];
    $city = \App\Models\City::whereName($from) // По названию города
        ->firstOrFail(); 
    
    // или
    // $fromId = $request->input['otkuda'];
    // $city = \App\Models\City::findOrFail($fromId); // По ID города
    
    dump($city->toArray()); // Получили город
    dump($city->airports->toArray()); // Получили список аэропортов города


    $airportId = $request->input['airportId'];
    $airport = \App\Models\Airport::findOrFail($airportId);
    
    dump($airport->toArray()); // Получили аэропорт по ID
    dump($airport->city->toArray()); // Получили город, в котором этот аэропорт находится.
    Ответ написан
    5 комментариев
  • Как парсить данные страницы, которые формируются на JS?

    MvcBox
    @MvcBox
    Software Engineer [C/C++/JS(for Node.js)/etc]
    Для PHP есть обертка над puppeteer
    https://github.com/rialto-php/puphpeteer
    Ответ написан
    Комментировать
  • Как парсить данные страницы, которые формируются на JS?

    alekciy
    @alekciy
    Вёбных дел мастер
    Нужно использовать webdriver и headless режим запуска браузера. Хром это умеет и самое простое сейчас это запустить его в docker пример как тут описано: https://stackoverflow.com/a/60009842 . А дальше можно посылать ему команды и можно делать не только парсинг, но и писать ботов. Управлять лучше через Xpath.

    Вот видео с техническими деталями и примерами кода как это может работать: https://www.youtube.com/watch?v=QljcCuKTqGM&list=P...
    А тут про XPath если с ним нет опыта: https://www.youtube.com/watch?v=id_MNxmdRvk
    Ответ написан
    Комментировать
  • Как через PHP можно скачать файл с YandexDisk?

    @alexalexes
    Через curl.
    Вот API для работы с опубликованными ресурсами Я-диска.
    https://yandex.ru/dev/disk/api/reference/public.html
    Ответ написан
    1 комментарий
  • Как через PHP можно скачать файл с YandexDisk?

    Acrilo
    @Acrilo Автор вопроса
    Никакие сторонние библиотеки и не понадобились.

    Простой код для скачивания архива с сервера YaDisk по ссылке:

    <?php
     $base_url = 'https://cloud-api.yandex.net/v1/disk/public/resources/download?';
    
    /**
     * Ссылка на файл YaDisk
     */
    $link = 'https://disk.yandex.ru/d/X2H8NijOtWahmQ';
    
    
    /**
     * Формирование API ссылки
     */
    $final_url = $base_url . 'public_key=' . $link;
    
    
    /**
     * Получение данных ответа
     */
    $ch = curl_init($final_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_exec($ch);
    
    $http_code = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
    curl_close($ch);
    
    /**
     * Проверка HTTP кода
     */
    if ($http_code === 200) {
        $json = json_decode(file_get_contents($final_url));
        $linkFile = $json->href;
    
        /**
         * Путь куда сохранять файл
         */
        $path = \Core\Services\Path\Path::public('tmp') . '/ar.zip';
        file_put_contents($path, file_get_contents($linkFile));
    
    } else {
        throw new RuntimeException('Ошибка 404. Страница файла указана неверно.');
    }
    Ответ написан
    Комментировать