Antonio
$response = $next($request); if ($response->status() >= 200 && $response->status() < 400) { $resp_data = $response->getOriginalContent(); if (!is_array($resp_data)) $resp_data = ['data'=>$resp_data]; $resp_data['more'] = [ 'foo' => '', 'bar' => '' ]; $response->setContent($resp_data); }
Antonio
Если подскажете как правильно проверить, что это удачный запрос, то вообще супер будет
Antonio
$response = $next($request); if ($response->status() >= 200 && $response->status() < 400) { $resp_data = $response->getOriginalContent(); if (!is_array($resp_data)) $resp_data = ['data'=>$resp_data]; $resp_data['more'] = [ 'foo' => '', 'bar' => '' ]; $response->setContent($resp_data); }
проблема в том, что $response->setContent хочет строку, а как можно отдать ему массив? или может есть способ корректно превратить Response в JSONResponse, если это не так?
Dmitry
мидлвара работает между запросом и контроллером. Что бы модифицировать ответ, используй ивенты
Antonio
мидлваре прекрасно работает и между контроллером и выдачей
Dmitry
мидлваре прекрасно работает и между контроллером и выдачей
ага, пока в контроллере это не поменяется ;)
Antonio
что не поменяется?
Dmitry
ты проверяшь статус ответа, до того как он обработан
Dmitry
да все что угодно может изменится
Antonio
$response = $next($request) получает ответ уже после обработки контроллером, или я неправ?
Dmitry
хм... по идеи это ответ от всех последующих мидлвар
Dmitry
а уже потом готовый реквест передается в контроллер
Dmitry
но может я и ошибаюсь...
Antonio
ошибаешься
Antonio
документация говорит обратное
Antonio
https://laravel.com/docs/5.5/middleware#defining-middleware
Antonio
before&after
Antonio
ну по хорошему, я везде возвращаю ресурс/ресурсколлекцию. И тогда все нормально добавляется в JSON.
Dmitry
before&after
по ходу ты прав
Antonio
но есть желание обработать тот вариант, когда контроллер вернет что-то кроме JSON (логическая ошибка, тестирование, и т.д.) И всеравно отдать JSON
Antonio
при этом не вспоминать об это в каждом экшене.
Antonio
Короче вопрос, можно ли Response превратить в JSONResponse ?
Dmitry
Короче вопрос, можно ли Response превратить в JSONResponse ?
можно, они только заголовками отличаются
Antonio
сами классы отличаются методами
Dmitry
ну так просто создай его, все данные у тебя есть
Antonio
а как сохранить правильные хедеры?
Dmitry
в конструктор их передавай
Dmitry
которые были уже в запросе
Antonio
глупый вопрос наверное, но в классе Response есть метод header(string $key, array|string $values, bool $replace = true) Set a header on the Response. но на получение ничего нет.
Antonio
на данном этапе дополнительные заголовки вроде бы не формирую, придется пока смириться с тем вариантом, что есть сейчас
Antonio
$response = $next($request); if ($response->status() >= 200 && $response->status() < 400) { $resp_data = $response->getOriginalContent(); if (!is_array($resp_data)) $resp_data = ['data'=>$resp_data]; $resp_data['more'] = [ 'foo' => '', 'bar' => '' ]; if ($response instanceof JsonResponse) $response->setData($resp_data); else $response = response()->json( $resp_data, $response->status() ); } return $response;
Dmitry
там вроде есть параметр публичный headers
Dmitry
как-то так наверное будет $request->headers->all()
Vladimir
Подскажите на счёт создания пакетов для Laravel. Есть какие-нибудь аналоги workbench из laravel 4? Или сейчас структуру пакета нужно создавать вручную?
Сергей
Подскажите если у меня поле json то как в контроллере обращаться к данным json?)
Сергей
Переводить в массив?
Alex
Переводить в массив?
а у тебя там что строка а не массив, проверь?
Antonio
Подскажите если у меня поле json то как в контроллере обращаться к данным json?)
если ты про поле в таблице, то ты его можешь кастить как угодно: хочешь в массив, хочешь в коллекцию, а хочешь, можешь закастить в какой-нибудь объект
Antonio
в моделе есть параметр $cast
Antonio
https://laravel.com/docs/5.5/eloquent-mutators#attribute-casting
Alex
строка
http://php.net/manual/ru/function.json-decode.php
Antonio
зачем это делать каждый раз, если можно добавить магии?
Antonio
у меня вот такая конструкция работает прекрасно:
Antonio
protected $casts = [ 'feedback' => 'Collection' ];
Alex
@kardashov а в чем вопрос?
Antonio
все флаги тоже стараюсь закастить в bool
Сергей
@kardashov а в чем вопрос?
Вариант Antonio я больше искал)
Сергей
все флаги тоже стараюсь закастить в bool
А как объястоят дела с добавлением?
Antonio
а уже добавили касты в объект произвольного класса?
я же сказал, не пробовал. Но если в Collection кастится, то почему бы и нет?
Antonio
А как объястоят дела с добавлением?
прекрасно. Когда сохраняешь модель он сам кастит обратно в JSON
Сергей
В объект тоже получилось)
Maksim (Ellrion)
В объект тоже получилось)
ну объект stdClass то понятно, достаточно доки прочитать
Maksim (Ellrion)
а вот если хочется типизированности то раньше точно небыло и я писал например https://github.com/Larapac/EloquentValueObjectCasts
Antonio
ну коллекция это коллекция)
Мда, моделька не типизировалась
Antonio
странно
Сергей
А подскажите как правильно реализовать вывод друг за другом? Допустим нужно на каждой новой странице по клику на следующую выводить посты друг за другом в порядке сортировки?
Сергей
Нужно передовать на страницу все записи и потом искать открытую и брать следующую?
Сергей
ну точнее в контроллере это передавать, ссылку следующей
Antonio
пэджинатор с шагом 1? =)
Сергей
не совсем) Есть открытая статья к примеру и есть кнопка следующая статья, как в кнопку следующей статьи передать ссылку? Если в базе они не друг за другом идут, а по полю сортировки нужно брать следующую статью
Antonio
ну тогда в моделе/контроллере/сервисе вычисли id/url и передай во вью
Сергей
Ага, ну я так и думал, просто решил узнать может есть какой нибудь способ по лучше, о котором я не знаю)
Сергей
Подскажите правильно ли так делать выборку следующей записи $lessons = Lesson::where([ ['section_id', '=', $section->id], ['sort', '>=', $lesson->id], ['name', '<>', $lesson_name] ]) ->orderBy('sort', 'asc') ->firstOrFail();
Ахмедов
/link@yetanotherstatsbot
Yet Another Stats (β)
https://b.yasb.exileed.com/t/laravel_pro
Antonio
ну я же не знаю, какая у Вас логика сортировки
Antonio
$nextLesson = $lesson->section->lessons()->where([['sort','>=',$lesson->id],['name','<>',$lesson->name]])->get();
Antonio
я бы вот так дергал, через зависимости
Antonio
в таком случае, если вы добавите в будущем какие-то глобальные ограничения на связку section->lessons, то они отработают и в этой выборке
Yet Another Stats (β)
https://b.yasb.exileed.com/t/laravel_pro
Yevhenii
Всем привет! Только изучаю Laravel Подскажите пожалуйста: Использую сборку homestead в файле homestead.yml указал mariadb: true не могу зайти в базу по адресу 127.0.0.1:33060/ В чем может быть проблема? Гугл и дока не помогла. Спасибо за ответ!