LINUX.ORG.RU

11
Всего сообщений: 65

Ищу работу удалённо: PHP/Laravel/PostgreSQL/MySQL/Vue/Angular/Bootstrap

Ищу работу удалённо. Оказываю следующие услуги:

  • Разработка веб приложений PHP/Laravel/PostgreSQL/MySQL/Vue/Angular/Bootstrap и т.д.

  • Написание скриптов для синхронизации DB из веб или API (пример: синхронизировать базу данных продуктов в Prestashop с продуктами из DelCampe API или вытащить все сообщения темы на форуме в БД)

  • Писал telegram боты

  • Созданный мной агрегатор CSV конфигурируемый через web UI с быстрым поиском в PostgreSQL, с подробным описанием и скриншотами: https://webtechsolutions.ml/portfolio/csv-feeds/

  • Опыт разработки Android приложения

  • Помогу настроить linux сервер по ssh

  • Прочие подобные услуги

  • Могу перевести текст технической направленности с английского

  • Могу оказать образовательные услуги в указанных выше областях

Контакты:

XMPP/Jabber: wtj12@jabber.ru

Email: тоже самое только домен mail.ru

Или просто сообщение на форуме.

С учётом пожеланий @mord0d:

  • почасовая оплата от 300 рублей в час, для мелких подработок можете просто пополнить счёт телефона (на сайте мегафона по карте не выходя из дома или через терминал)

  • оплата за конкретный проект после расммотрения ТЗ

  • если хотите предложить постоянную работу тогда от 20,000 рублей в неделю (70 часов работы)

 , , , ,

wtj12 ()

Компоненты Laravel 7 & page title

В blade Laravel 7 презентован новый синтаксис компонентов, когда внутри view стало возможным писать что-то вроде

<x-mycomponent param1="value" param2="value"/>

Всё круто, но возникает вопрос, на который нигде не могу найти ответ. А можно ли как-то изнутри компонента задать значение переменной в родительском view (в котором прописан тег компонента)? Ну то есть это то, что возможно делать с помощью @yield и @extends.

Поясню. Пусть, например, есть файл layout.blade.php:

<html>
<head>
   <title>@yield('title')</title>
</head>
<body>
    <x-mycomponent param1="value" param2="value"/>
</body>
</html>

И, собственно, шаблон подключаемого компонента:

@section('title', 'Заголовок страницы');

<div>
А здесь какой-то контент компонента
</div>

Я ожидаю, что title будет установлен компонентом, как если бы он наследовал layout через @extends. Но этого не происходит. Как-то можно сделать это с использованием нового синтаксиса компонентов Laravel 7? А то если нет, то это весьма существенное ограничение его использования.

 ,

Novascriptum ()

ORM internals:View from within

В очередной раз хочу заняться изучением Laravel.

Вопрос по сабжу, накидайте примеров простеньких ORM c GitHub, чтобы можно было понять, как это устроено изнутри.

Во внутрянку Eloquent ORM пока лезть не хочу, т.к. боюсь запутаться.

Хотя вот — https://pic4a.ru/02/6tz.jpg ,может бояться не нужно)

 , , ,

Twissel ()

Что быстрее laravel или django?

 , , ,

Deleted ()

нубский вопрос про выбор веб-платформы

Господа коллеги, день добрый!

Я тут выбираю между Laravel и Zend Framework 2.

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

В отличае от ZF, который довольно раскручен, и видно, что у него большая перспектива.

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

 , , ,

Infra_HDC ()

Как добавить стандартный JQuery Datepicker в Laravel 5.5?

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

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

https://medium.com/@Oriechinedu/how-to-add-jquery-ui-plugin-to-a-laravel-app-...

Сбрасываю все кеши, не забываю про 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();


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

 , ,

Xintrea ()

Как в Laravel при логине пользователя перейти на фиксированную страницу?

Имею Laravel 5.5, стандартную систему логина пользователей.

И имеется такая проблема. При логине пользователя мне нужно, чтобы открывалась вполне конкретная страница. В моем случае это

/personalArea

Чаще всего именно так и происходит, но не всегда. Если пользователь разлогинится и потом залогинится, то редирект на /personalArea сработает. А если пользователь поработает в системе, выключит компьютер (без разлогирования), на следующий день включит, введет пароль, то система будет пытаться открыть ту страницу, на которой ранее находился пользователь.

А мне нужно, чтобы всегда при логине открывалась страница /personalArea.

Сейчас настройки следующие.

1. В файле app/Http/Controllers/Auth/LoginController.php прописано свойство:
    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/personalArea';


2. В файле app/Http/Middleware/RedirectIfAuthenticated.php содержится следующий код:
    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check()) {
            return redirect('/personalArea');
        }

        return $next($request);
    }


Что где еще надо крутить, чтобы перенаправление при логине всегда срабатывало на нужный мне адрес?

 , , , ,

Xintrea ()

Тестирование в Laravel. Как задать переменную сессии в POST-запросе?

Что-то я затупил. Решил поразбираться как делать Feature-тестирование в Laravel и застрял. У меня Laravel 5.5, и тестовое окружение:

use Illuminate\Foundation\Testing\TestCase;


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

https://laravel.com/docs/5.5/http-tests#session-and-authentication
class ExampleTest extends TestCase
{
    public function testApplication()
    {
        $response = $this->withSession(['foo' => 'bar'])
                         ->get('/');
    }
}

То есть, сделать GET-запрос с предварительной установкой сессионной переменной возможно. Но если вместо метода get() я пишу post(), то получаю ошибку:
Error: Call to undefined method Tests\Feature\PublicIntercomPagesTest::push()


И я понять не могу, почему нельзя устанавливать сессионную переменную при POST-запросе.

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

 , , , ,

Xintrea ()

Какой стек лучший Python(Django) или PHP(Laravel)?

Какой стек лучший Python(Django) или PHP(Laravel)? Я хочу услышать мнение людей? Плюсы и недостатки у обоих? Возможно даже если не Larevel или Django, есть ещё Flask, Yii и т.д. Как то я пытался изучить Django после питона, но у них документация показалось для меня очень большой все сразу не прочитаешь и не поймешь. Как к людям начинают осенить Django, после каких действий они начинают комфортно писать код на джанге? PHP тоже пытался учить после питона, но мне некоторые вещи показались не очень логичными в плане синтаксиса. Меня учили в книгах питона вот так..., а в php все наоборот... И начинается обдумывание и головные мозгодробительство. Почему так сделано, я же читал в питоне нужно так делать, а почему в PHP все наоброт, и т.п. такие вопросы. Возможно я что-то пропускаю в PHP. Но я не обсираю этот язык. Ни в коим случае! Я просто хочу стать веб разработчиком и любить свою работу. Пока что я знаю HTML, CSS и малеха Python. А! Ещё забыл, статические генераторы сайтов, такие как Hugo. Но в этих стат.генераторах писать код очень топорно и ограничено. Фиг чё толкового напишешь.

 , , , ,

Deleted ()

Где прячется задача для Laravel-очереди?

Что-то странное у меня творится.

У меня есть задача для Laravel-очереди, написанная в виде PHP-класса, как положенно. Внутри этой задачи вызывается Shell-скрипт. Задачи хранятся в MariaDB.

И по логам я вижу, что этот Shell-скрипт все время запускается, причем с определенными параметрами.

Его никто кроме Laravel-очереди запускать не может. Но я смотрю в таблицу jobs и в таблицу failed_jobs - там пусто, ни одной записи. И я не могу понять, почему эта задача отправляется на выполнение. Я уничтожаю процесс этого скрипта, но он снова появляется. Его однозначно запускает Laravel-очередь.

В файле /etc/supervisor/conf.d/laravel-worker.conf у меня прописана команда:

command=php /var/www/mysite/artisan queue:work --sleep=3 --tries=3

То есть, бесконечно задача запускаться не должна (максимум 3 раза). Но она реально запускается бесконечно.

Я не пойму, где эта задача хранится? Почему она перезапускается бесконечно? Ее перезапускает сам supervisor, или тупит artisan queue:work, все время генеря новую задачу при старте через supervisor? Где это можно посмотреть?


UPD1: Сейчас проделал такой экспериент. Сначала остановил supervisor:
supervisorctl stop laravel-worker:*

Затем удалил процесс проблемного скрипта, и запустил вручную команду обработки очереди:
command=php /var/www/mysite/artisan queue:work --sleep=3 --tries=3

В результате проблемный скрипт НЕ запустился.

Получается, что его бесконечно запускал именно supervisor. Но в supervisor ведь прописана только команда «php /var/www/mysite/artisan queue:work --sleep=3 --tries=3», то есть скрипт не может запуститься сам, ему нужно чтобы сработало задание очереди!

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


UPD2: В логе /var/log/supervisor/supervisord.log за период, когда бесконечно запускался проблемный скрипт, нет ничего, ни одной записи.

 , , ,

Xintrea ()

Кнопка типа <button> - не хочет переходить по ссылке

Имею страницу с URL:

http://site.loc/personalArea/userHoldObjects/objectCard/show/18

В ее HTML-коде есть кнопка:

<form method="POST" action="#" ... >

<button 
 id="connectRoomToEnraceToBuildingButton" 
 name="connectRoomToEnraceToBuildingButton" 
 class="btn bth-default" 
 onclick="window.location='http://site.loc/personalArea/userHoldObjects/connectRoomToEnraceToBuilding/18'">
 
 <span class="glyphicon glyphicon-th"></span> Подключить

</button>

Когда я ее нажимаю, следует переход на URL:

http://site.loc/personalArea/userHoldObjects/objectCard/show/18#

Вместо того чтобы перейти на URL:

http://site.loc/personalArea/userHoldObjects/connectRoomToEnraceToBuilding/18

Почему так происходит? Кнопка не имеет тип submit, это просто кнопка. Я даже проверил в консоли выполнение кода:
window.location='http://site.loc/personalArea/userHoldObjects/connectRoomToEnraceToBuilding/18'

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

 , ,

Xintrea ()

Странные вещи в MySQL - стали обнуляться поля created_at и updated_at в Laravel 5.5

Наблюдаю сейчас неожиданную вещь. В базе данных в разных таблицах некоторые записи получают значения NULL в полях created_at и updated_at. Закономерность понять пока не смог.

Чаще всего обнулены оба поля:

http://i.piccy.info/i9/ad763b5e450b658e4547b5414b156191/1557687406/114867/131...

Но бывает, что только одно:

http://i.piccy.info/i9/4d87d0c404978c4d7fd0918491ddf9df/1557687435/30642/1314...

Это стандартные поля, они должны обрабатываться автоматически. Я их специально не настраиваю, в базу они добавляются просто благодаря стандартной команде timestamps() в миграции:

Schema::create('my_table', function (Blueprint $table) {
  $table->increments('id');
  $table->timestamps();
...


Вроде до какого-то момента, эти поля всегда заполнялись четко. Но сейчас заметил, что они обнуляются. Понять причину не могу.

Это происходит на двух хостах - и на машине разработчика, и на тестовом сервере. Базы данных, естественно, разные.

В чем может быть проблема?

 , , , ,

Xintrea ()

Выборка записей по времени в Laravel - не работает

Имею 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 конструировать запрос с выражением времени так, чтобы это выражение не помещалось в кавычки?

 , , , ,

Xintrea ()

Редактор текста в Laravel с картинками и прикрепляемыми файлами

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

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

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

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

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

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

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

 , , , ,

Xintrea ()

Как в Laravel 5.5 сделать кастомные страницы с ошибками?

В документации написано, что чтобы сделать кастомные страницы с ошибками, достаточно создать каталог resources/views/errors, а в нем файлы вида 404.blade.php

https://laravel.com/docs/5.5/errors#custom-http-error-pages

Я сделал так, насоздавал в resources/views/errors файлы:

404.blade.php
419.blade.php
429.blade.php
500.blade.php
503.blade.php
layout.blade.php


Но проблема в том, что все равно показываются стандартные страницы с ошибкой. Сбросил все виды кеша - толку никакого.

Нашел еще решение, что для того, чтобы эти страницы заработали, нужно изменить метод render() в файле app/Exceptions/Handler.php:

    public function render($request, Exception $exception) {
        
        info("In Exception render");
        
        // Отрисовка самодельных страниц с ошибками
        if ($this->isHttpException($exception)) {
            
            info("Detect Exception with code ".$exception->getStatusCode());
            
            if (view()->exists('errors.' . $exception->getStatusCode())) {
                return response()->view('errors.' . $exception->getStatusCode(), [], $exception->getStatusCode());
            }
        }
        
        return parent::render($request, $exception);
    }


Но проблема в том, что когда происходит ошибка, например 404, до этого метода render() дело не доходит. Строки «In Exception render» в логе не появляется, и рисуется стандартная страница.

Вопрос: как правильно сделать свои собственные страницы об ошибке?

 , , , ,

Xintrea ()

Как работает onQueue() в очередях Laravel?

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

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

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

 ,

Xintrea ()

Можно ли через очередь Laravel заблокировать отправку частых событий?

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

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

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

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

 ,

Xintrea ()

Как запустить Validator так, чтобы он повторно вызывал запрос со старыми данными?

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 генерировал правильный запрос со старыми данными. Как решить эту проблему?

 , ,

Xintrea ()

Почему пустая строка превращается в null в $request->input() в Laravel?

В контроллер поступают следующие данные:

POST Data
- channelTypeId «2»
- notifyChannelValue «»
- addButton «»

А вот код контроллера:

public function addChannelApply(Request $request) {
  $channelTypeId = $request->input('channelTypeId'); // Тут получается нормальное значение
  $channelValue = $request->input('notifyChannelValue'); // А тут null
    
  return dd($channelValue);
}


И этот контроллер выдает в браузер null.

Пытался задать вторым параметром input() значение по-умолчанию '12345'. Но оно не возвращается, видимо потому что POST-переменная таки существует, а значение по-умолчанию должно подставляется если переменной нет. То есть dd() все равно пишет null.

В то же время, метод input() должен возвращать null, если переменной нет. И, похоже, input() это и делает - он возвращает null.

В общем, я не могу понять, как получить значение POST-переменной notifyChannelValue в явном виде, то есть пустую строку?

 , , ,

Xintrea ()

Исключения и Laravel - не пойму

Не пойму, почему не работают исключения.

Пишу такой код:

try {
    $phone=UserChannels::where('user', Auth::user()->id)->where('channel_type', $phoneTypeId)->first()->value;
} catch (Exception $e) { 
    $phone='';
}


По идее, при любой ошибке он должен просто сделать $phone=".

Но вместо этого Laravel показывает ошибку на длинной строке:

ErrorException (E_NOTICE)
Trying to get property of non-object


Вопрос: почему Laravel ловит исключение, а не блок catch{} ?

 , , , ,

Xintrea ()