LINUX.ORG.RU

10
Всего сообщений: 59

Как в 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. Но в этих стат.генераторах писать код очень топорно и ограничено. Фиг чё толкового напишешь.

 , , , ,

dimcoin ()

Где прячется задача для 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 ()

Laravel генерирует ошибку при обработке AJAX-запроса

Laravel 5.5

Пытаюсь запустить тестовый пример вот отсюда:

https://webformyself.com/laravel-ajax/

Но он не работает.

В логе веб-сервера вижу, что POST-запрос приходит. В браузере вижу, что Laravel попыталась обработать AJAX-запрос, но не смогла. Ответное сообщение приходит, но не с маленьким JSON-ответом, а с портянкой ошибки.

Судя по портянке, до контроллера выполнение не доходит, потому что нет никакого упоминания про AjaxController.php. То есть, что-то происходит в глубинах Laravel, но я не могу понять что.

Вопрос: как заставить работать этот пример?

Код ответного сообщения:

{
    "message": "",
    "exception": "Symfony\\Component\\HttpKernel\\Exception\\HttpException",
    "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php",
    "line": 203,
    "trace": [
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php",
            "line": 175,
            "function": "prepareException",
            "class": "Illuminate\\Foundation\\Exceptions\\Handler",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/app/Exceptions/Handler.php",
            "line": 51,
            "function": "render",
            "class": "Illuminate\\Foundation\\Exceptions\\Handler",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",
            "line": 83,
            "function": "render",
            "class": "App\\Exceptions\\Handler",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",
            "line": 55,
            "function": "handleException",
            "class": "Illuminate\\Routing\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php",
            "line": 49,
            "function": "Illuminate\\Routing\\{closure}",
            "class": "Illuminate\\Routing\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 149,
            "function": "handle",
            "class": "Illuminate\\View\\Middleware\\ShareErrorsFromSession",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",
            "line": 53,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php",
            "line": 63,
            "function": "Illuminate\\Routing\\{closure}",
            "class": "Illuminate\\Routing\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 149,
            "function": "handle",
            "class": "Illuminate\\Session\\Middleware\\StartSession",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",
            "line": 53,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php",
            "line": 37,
            "function": "Illuminate\\Routing\\{closure}",
            "class": "Illuminate\\Routing\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 149,
            "function": "handle",
            "class": "Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",
            "line": 53,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php",
            "line": 66,
            "function": "Illuminate\\Routing\\{closure}",
            "class": "Illuminate\\Routing\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 149,
            "function": "handle",
            "class": "Illuminate\\Cookie\\Middleware\\EncryptCookies",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",
            "line": 53,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 102,
            "function": "Illuminate\\Routing\\{closure}",
            "class": "Illuminate\\Routing\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
            "line": 660,
            "function": "then",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
            "line": 635,
            "function": "runRouteWithinStack",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
            "line": 601,
            "function": "runRoute",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
            "line": 590,
            "function": "dispatchToRoute",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
            "line": 176,
            "function": "dispatch",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",
            "line": 30,
            "function": "Illuminate\\Foundation\\Http\\{closure}",
            "class": "Illuminate\\Foundation\\Http\\Kernel",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/fideloper/proxy/src/TrustProxies.php",
            "line": 56,
            "function": "Illuminate\\Routing\\{closure}",
            "class": "Illuminate\\Routing\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 149,
            "function": "handle",
            "class": "Fideloper\\Proxy\\TrustProxies",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",
            "line": 53,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php",
            "line": 30,
            "function": "Illuminate\\Routing\\{closure}",
            "class": "Illuminate\\Routing\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 149,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",
            "line": 53,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php",
            "line": 30,
            "function": "Illuminate\\Routing\\{closure}",
            "class": "Illuminate\\Routing\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 149,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",
            "line": 53,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php",
            "line": 27,
            "function": "Illuminate\\Routing\\{closure}",
            "class": "Illuminate\\Routing\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 149,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",
            "line": 53,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php",
            "line": 46,
            "function": "Illuminate\\Routing\\{closure}",
            "class": "Illuminate\\Routing\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 149,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",
            "line": 53,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 102,
            "function": "Illuminate\\Routing\\{closure}",
            "class": "Illuminate\\Routing\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
            "line": 151,
            "function": "then",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
            "line": 116,
            "function": "sendRequestThroughRouter",
            "class": "Illuminate\\Foundation\\Http\\Kernel",
            "type": "->"
        },
        {
            "file": "/media/wd_640_part_2/home64bit/xi/work/develop/php/tukituk/site/public/index.php",
            "line": 55,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Kernel",
            "type": "->"
        }
    ]
}

 , ,

Xintrea ()

Как ориентироваться в документации на Laravel API?

Использую Laravel 5.5

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

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

https://laravel.com/api/5.5/Illuminate/Database/Eloquent/Model.html

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

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

 , ,

Xintrea ()

Веб-формы без кнопки Submit: как это нынче делается с Laravel/Vue/jQuery ?

Есть веб-форма без кнопки Submit. На ней есть текстовое поле.

Вопрос: как нынче организовывают сохранение значения, введенного в это поле?

Пока что вижу следующий примитивный путь:


  • Через jQuery вешается обработчик на текстовое поле на событие focusout;
  • В обработчике формируется AJAX-запрос через jQuery функцию $.ajax(), в запросе не забываю про csrf_token();
  • В Laravel делаю контроллер, который принимает Ajax данные, вычленяет из них переданное значение поля, сохраняет в базу;
  • Контроллер возвращает строку ошибки. Если пустая - ошибки нет, иначе на странице должно всплыть предупреждение что данные не могут сохраниться.


Следует ли делать так сохранение значения, или сейчас делают как-то по-другому? Через Vue вместо jQuery или еще как? В Laravel может есть готовые классы/механизмы для этого?

Дайте краткое описание и ссылки на доку/howto, желательно на русском.

 , ,

Xintrea ()

Как в Laravel получить из таблицы-справочника массив вида id=>name ?

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

id name
1 name1
5 name5
7 name7


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

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


?

 , , , ,

Xintrea ()

Отправка писем из Laravel с помощью SMTP через yandex.ru

Для теста настроил в системе программу 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

 , , , ,

Xintrea ()

Не получается использовать вид из подкаталога в Laravel 5.5

Имеются два вида, которые расположены так:

/resources/views/personalArea/userHoldObjects.blade.php
/resources/views/personalArea/userHoldObjects/userHoldObjectsBlock.blade.php


В вид userHoldObjects я пытаюсь подключить userHoldObjectsBlock.

Код вида userHoldObjects выглядит так:

@extends('personalArea.personalAreaTemplate')

@section('content')

    @include('userHoldObjects.userHoldObjectsBlock')

@endsection


Ошибка:

ErrorException (E_ERROR)
View [userHoldObjects.userHoldObjectsBlock] not found. (View: /home/xi/work/develop/php/tukituk/site/resources/views/personalArea/userHoldObjects.blade.php)

 , ,

Xintrea ()