Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Благодарю, я тоже к третьему варианту склонялся, но все-же надеялся на чудо
sync - сразу же выполнять задачи очереди, так?
Отправить почту на несколько адресов, создать лида в CRM занимает по времени где-то 3-5 секунд (AmoCRM почему-то долго отрабатывает). Заставлять пользователя ждать 5 секунд - не очень правильно.
Добрый день.
У кого-то есть опыт использования очередей на shared хостингах? Как решали контроль работы слушателя задач, например, если хостер прибьет задачу?
Единственно, что придумал гарантированно запускать задачи - cron + artisan schedule:run, в kernel смотреть - есть ли записи в jobs, если есть - запускать команду `queue:work --once` по количеству задач в таблице. Но это как мне кажется то еще решение...
В сети предлагают планировщиком запускать
$schedule->command('queue:work --daemon')->everyMinute()->withoutOverlapping();
Но если прибить руками (kill -9) задачу она все-равно будет числиться в кеше и не перезапустится. Нужен совет. Советовать уйти от шаринга - бесполезно, я уже несколько недель пытаюсь убедить заказчика.
Ну, простите, очепятался.
Нашел, как это сделать. Надо получить от ответа значения сессии и передать их обратно (нужные параметры):
$session = app('session.store');
Модуль, который необходимо тестировать обрабатывает большой массив данных в xml. Работа ведется по типу обмена с 1C, т.е. какое-то время работает, потом прерывает работу, отсылает ответ, если не ok — внешний процесс опять тыкается по ури (передавая данные аутентификации, имя и ид сессии в хедере) и процесс возобновляется с прерванного места.
Собственно вопрос: что будет сохранено в сессии не известно, известны лишь ключи. Как в тесте заставить использовать сессию? В доке пишут, что можно передавать значения сессии в тест, но они не известны.
php artisan --version
Нет, не нужна дополнительная инициализация. phone тоже должно быть в кавычках:
{!! Form::number('phone', null, array('class' => 'form-control', 'id'=>'phone')) !!}
Не работает что-то нифига, laravel 5.4. В самый первый раз отрабатывает. Потом валидацию не проходит. Он даже не пытается читать куки, открывать сессию, тупо создает новую (хотя не пишет её в storage) в последующие разы.
Если следовать принципам (я думаю - их не зря не глупые люди придумывали) ООП, инкапсуляции в частности, это не правильно. ВСЕ свойства должны быть private/protected, а доступ к ним средствами методов. Конкретно свойство, которое сообщает внешнему миру о внутреннем состоянии модели - однозначно не должно быть публичным, а приватным (даже не защищенным, чтобы наследники не могли менять).
С другой стороны - это exists - публичное, т.е. ни что не мешает кому-то сделать new Модель(), затем присвоить этой exists - true, блин дырища-то какая!
Я понимаю, что вы не являетесь разработчиками форума, но времени нет совсем искать их багтрекер, поэтому сюда пишу. Когда хотел плюсануть ответ меня перекинуло на страницу входа (если картинки нет):
Хотя я залогинен и перед тем как плюсануть написал ответ. После нажатия "... и запомнить меня" - появилось вот это (если картинки нет):
В форум редиректа не было. Мелочь, а не приятно.
Спасибо тебе, Человечище!!!
Ну, или как варинат - смотри, с какого ури пришли в стандартный контроллер, если /admin/login (или как оно там у тебя) - метод showLoginForm отдаёт вьюху однмина, если что-то другое - фронтэнд. Но это плохо. Кони - в дом, люди - в стойло! На том стояло и стоит ООП.
Кони-люди - всегда плохо. Для фронтэнда один контроллер, для бэкэнда свой. Роутов понадобится два (если канеш не хочешь чтобы там еще регились, сбрасывали пароли).
// форма входа
Route::get('/admin/login', 'AdminLogin@showLoginForm')->name('adminLoginForm');
// проверка правильности ввода
Route::post('/admin/login', 'AdminLogin@login')->name('adminLoginCheck');
Контролллер:
namespase Бла\Бла;
use ...
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class AdminLogin extends Controller {
// в этом трейте вся магия
use AuthenticatesUsers;
protected $redirectTo = '/туда-пойдешь-что-то-не-найдешь';
public function showLoginForm() {
return view('вьюхаОдминаТупоКопипастишьИзСтандартнойСПоправкойНаСвоиНуждыИРоуты');
}
// если сильно надо можешь переопределить остальные методы трейта, логин, кол-во попыток (это уже другой трейт, его AuthenticatesUsers пользует), его и прочее и прочее
}
Да, и в посреднике, который будет на эту форму (логин админа) всех слать рекомендую дописать:
public function handle($request, Closure $next)
{
if(проверкаТвоихУсловий === false)
{
return redirect()->guest(route('adminLoginForm'));
}
return $next($request);
}
Это чтобы в методе sendLoginResponse(Request $request) наверняка работал редирект обратно на ту страницу, откуда чел попал на форму логина в админку.
Код не проверял, но должОн работать.
Ну, как бы тестовое окружение по-другому работает. В config/database.php настраивается подключение, затем в phpunit.xml указывается его название.
Вот, изменены только настройки подключения к бд
APP_ENV=local
APP_KEY=base64:pOFWM9/ZLdQPfF0hkZAlV0+6wTIPXxcSLWziAA4T1UU=
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://localhost
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=myLaravel
DB_USERNAME=root
DB_PASSWORD=
BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
PUSHER_APP_ID=
PUSHER_KEY=
PUSHER_SECRET=
При тестировании кода пользовался mysql, все ок, но довольно долго. Решил использовать sqlite :memory:, первый-же тест бд отвалился с ошибкой. Вот, что мне пишет phpunit:
SQLSTATE[HY000]: General error: 20 datatype mismatch (SQL: insert into "users" ("username", "name", "email", "password", "id", "updated_at", "created_at") values (admin, admin, admin@admin.com, $2y$10$pn7sMyUhibQ0ulMhcAdGouBLkFrJfZfTmMNuic9jDFgKus6KdKYEC, 814526de-292e-4190-a447-f18bd958c696, 2016-11-25 07:28:32, 2016-11-25 07:28:32))
Т.е. значения полей не обернуты в " или ', может кто-то подскажет.
И еще одна не очень приятная штука, у меня одна модель использует SoftDeletes, но при работе с sqlite поле deleted_at не создается, хотя в mysql все отлично.
Про наследование и переопределение что-нить слышал? Хотя, если-бы слышал - не было-бы этого вопроса.
1. создать свои контроллеры
2. создать свои представления (views)
3. создать свои роуты
4. кушать печеньки
С созданием миграций проблем нет все ок. Я вообще искал информацию, дабы исключить возможные проблемы на будущее. Конкретно у меня все работает, но я думал, что можно так-же указывать путь при создании чего-то другого при помощи artisan, к примеру make:seeder , но параметр --path не отрабатывает у меня для этой команды, вот и искал возможную причину. Зачем мне сиды в другой папке? Ну в доке написано, что я могу делать структуру как мне велит шайтан.
Про фан - смешно, да.
Это будет небольшая специфичная библиотека. Я не знаю, как и что будет делать человек, который будет пользоваться ею, как он будет выполнять инициализацию конкретной модели (ни кто не мешает сделать new модель и попытаться вызвать метод, который предоставит доступ к скрытой информации). Поэтому хотел исключить потенциально опасную ситуацию. Но спасибо за ответы.
Здравствуйте!
Вопрос вот в чем, если в коде вызвать
$exp = new MyModel()->where(...)...
то если is_null($exp) - запись не найдена.
А как быть, если надо узнать внутри модели - загружена ли она? Например, если модель создана при помощи
$exp = new MyModel();
а затем был вызван метод, который не должен отрабатывать на не загруженной модели.
Пока реализовал вот так:
if(!empty($this->original))
Но кажется мне, должна быть как-то по-другому эта проверка выполняться.
Честно - искал ответ, но не нашел Ткните носом
Благодарю.
Я дичайшим образом извиняюсь, но не могу найти этот соседний топик