Сильно усложнили невероятно простую тему. Ведь по сути транзакция в ларавел это очень простая конструкция типа try { DB::beginTransaction(); // код работы с базой Db::commit(); } catch (\Exception $exception) { Db::rollBack(); // обработка исключения } А все остальное в видео это просто обычный CRUD только с доп. условиями для частного случая когда вместе с созданием поста нужно также создавать категорию, новые теги итд.
@elgrenka Жыл бұрын
Я заметил у автора есть любимая фраза: "Делается это просто". 😁
@Olegcowboyoleg10 ай бұрын
Кстати, вот мы уже перешли на работу с АПИ, и с методах контроллеров у нас везде прописано возвращение JSON. То есть в браузере мы уже не видим привычный нам фронтэнд. Одни джейсоны. В предыдущих видео уже задавали такой вопрос о разделении логики запросов (кто и что запрашивает), но автор так и не ответил на них.
@cheshirecat10806 ай бұрын
В BaseController создаешь метод который проверяет на префикс api $request->is('api/*'); , и возвращает булевое значение. Далее в контроллерах в зависимости от данного значение возвращаем либо json, либо view. Желательно создать отдельные контроллеры для web и api, но для начала и так пойдет.
@Stauroman2 жыл бұрын
столько горячих клавиш от тебя узнал, спасибо)
@YasaFit2 жыл бұрын
Фух, только со второго раза понял. Тут бы пару конкретных примеров привести, откуда и как вот эти данные приходят, api, фронт... Спасибо за уроки!
@vimitali76303 жыл бұрын
Спасибо, за урок! Очень крутая и простая подача материала!
@laravelcreative3 жыл бұрын
Благодарю!)
@AlyonaPetrova Жыл бұрын
Спасибо за суперские уроки! У кого возникала ошибка 500 и не попадала в Exception, говоря, что массива тегов нет: поставьте (\Exception $exception) и произойдет чудо!
@alexandriv21742 жыл бұрын
супер урок то что я искал полтора месяца - вот они ответы на все мои вопросы
@laravelcreative2 жыл бұрын
Благодарю!)
@TheDinamitt3 жыл бұрын
Спасибо за видео, контент огонь! Недавно решал подобную задачу, про транзакции не знал.
@laravelcreative3 жыл бұрын
Благодарю!) Успехов в развитии!)
@sergeyromanov19202 жыл бұрын
Спасибо за урок, стало больше понятно зачем и как юзать всякие resource и try catch в действии
@plutuss3 жыл бұрын
Спасибо, очень хороший и полезный урок.
@laravelcreative3 жыл бұрын
Благодарю!)
@Olegcowboyoleg10 ай бұрын
И самое главное: вот мы пишем пишем этот код (полдня!), а для чего и почему и что такое транзакция - не было рассказано ни в уроке по SQL, ни здесь. Самая важная чать всего обучения - это для чего мы что-то делаем, цель всего.
@moneybobr9 ай бұрын
Бальзам на душу
@ИгорьПавлов-г9ц Жыл бұрын
При Update создаю getTagIdsWhisUpdate, вношу всё, как на видео, но при dd выходит ошибка 500 Illuminate\Database\Eloquent\MassAssignmentException: Add [id] to fillable property to allow mass assignment on [App\Models\Tag]. Не совсем понимаю, что делаю не так. До этого весь код работал стабильно
@lyrics1536 Жыл бұрын
protected $guarded = [];
@lyrics1536 Жыл бұрын
это в модели прописать нужно, тоже на этом попался
@freudehoffmann8717 Жыл бұрын
protected $guarded = ["tag_id"];
@spitzer40772 жыл бұрын
Получилось, но эта донельзя атомизированная логическая структура Laravel всё никак интуитивно не запоминается:(
@eugene_kulik2 жыл бұрын
21:50 На самом деле ошибки не будет, у меня наоборот, если я оставлю все как есть (return new StoreResource($response)), то у меня, при любой ошибке, будет возврашен json с ключем message, в котором будет намного информативней описание ошибки, чем в варианте автора. Может это зависит от версии Laravel, я не знаю
@laravelcreative2 жыл бұрын
Благодарю!)
@koldunfd2 жыл бұрын
DB::Commit в апдейте не сделали
@Olegcowboyoleg10 ай бұрын
14:30 ругается у меня на строку $category=$data['category']; У нас же нет category! Только если закомментировать строку, но у автора прокатывает. КАК?
@Olegcowboyoleg10 ай бұрын
Сорян, туплю, надо грамматику учить.
@SergLu-t5m Жыл бұрын
Благодарю за урокu. все доходит по чуть) единственная до этого была проблема при сохранении поста, если ни одного тега не указывал. пришлось в 19 уроке проверку вставить if(isset($data['tags']){$tags=$data['tags']; ... в этом уроке второй раз похожая ошибка выскакивает. Как у вас транзакция не срабатывает когда в JSON нет тегов. выдает ошибку 500 и пишет что нет массива с тегами. практически уверен что все прописано верно. может это быть от версии laravel?
@nihongo_ Жыл бұрын
у меня Service не сработал и однометодные контроллеры🥲
@Исскуство-т7л2 жыл бұрын
Здравствуйте! Скажите,пожалуйста,всё сделал как в видео, получилось как у вас всё в конце,перепроверил, но постман показывает,что всё обновляется, а в базе никаких изменений не проходит. Такие же посты,категории,тэги.
@ЕкатеринаХлебец2 жыл бұрын
У меня была такая же проблема. В файле Service.php в методе Update, не было команды DB::commit().
@Исскуство-т7л2 жыл бұрын
@@ЕкатеринаХлебец Спасибо!
@Исскуство-т7л3 жыл бұрын
Здравствуйте! Подскажите,пожалуйста, всё делаю по видео,выдаёт 500 ошибку уже на dd после $data =$request->validated(); Хотя сам запрос возвращается.Может не проходит валидацию? Почему мы category_id меняем на category в ключах? и откуда это взялось? Прошу помочь разобраться.
@laravelcreative3 жыл бұрын
После валидации сразу ошибка?) Попробуй убрать реквест и любые другие аргументы в методы и проверит дд. Потом по одному добавляй аргменты, которые были назад и смотри что будет) invoke(вот тут аргументы)
@Исскуство-т7л3 жыл бұрын
@@laravelcreative там всё получилось решить,другая проблема в конце видео. Подскажите,пожалуйста, возвращается ответ 200,возвращается дата новая,а в базе изменений никаких не происходит нигде, ни в посте, ни в категория, ни в тэгах,уже несколько раз пересматривал видео, всё перепроверял,ничего не выходит.
@westlutsk3 жыл бұрын
@@laravelcreative точно так же возвращает масив из 6 обьектов и 500 ошыбка
@bohdanlebedovskyi76122 жыл бұрын
@@Исскуство-т7л подскажите как получилось победить 500 ошибку. Заранее благодарен
@ДаниилГусев-с7ц2 жыл бұрын
@@bohdanlebedovskyi7612 у меня postman при dd тоже выдавал ошибку, даже при dd(1111). Я просто продолжил работу, не обращая внимания на статус код, и вся логика оказалась валидной.
@qoonmax3 жыл бұрын
Нужно ли оборачивать в транзакции какие либо методы, которые мы используем в Store и Update, но которые в себе также содержат работу с базой? Вроде getTagIds и всех остальных которые есть в сервисе, но не update и store.
@laravelcreative3 жыл бұрын
В идеале, если идет взаимодействие больше, чем с одной таблицей, надо оборачивать в транзакцию)
@qoonmax3 жыл бұрын
@@laravelcreative я не много о другом. Если например в одном контроллере у нас есть 3 метода, 1 основной получает результат двух других методов, вызывая их, то нужно ли внутри этих двух методов ставить транзакции если есть транзакция в методе который вызывает остальные два. То есть в случае если я внутри «главного» метода вызываю другой метод и результат его выполнения хочу записать в переменную, но что-то идёт не так, сработает ли роллбек для операций в том методе который я вызываю?
@laravelcreative3 жыл бұрын
Сколько бы ты методов не создавал, процесс протекает в основном методе или экшн или это инвок. По сути, весь код на самом деле находится в одном месте. Поэтому да, это тоже нужно обернуть в транзакцию:) Опять-таки, если идёт взаимодействие в основном методе о 2 и более моделей, то это транзакция. Даже, если ты вынес это в отдельные методы. Значит вызов этих методов будет внутри транзакции:)
@qoonmax3 жыл бұрын
@@laravelcreative Спасибо большое!
@ivanteplyakov3185 Жыл бұрын
Интересное видео, а это точно базовый курс с нуля?)
@biLLie_wiLLie2 жыл бұрын
13:40 cmd + shift + enter (для Mac)
@alexandr99002 жыл бұрын
камент для продвижения
@laravelcreative2 жыл бұрын
Благодарю!)
@alexandriv21742 жыл бұрын
Извините а обязательно транзакции делать в api или в web тоже можно
@laravelcreative2 жыл бұрын
в веб тоже можно и нужно)
@alexandriv21743 жыл бұрын
подскажите правильно я понимаю web и api могут работать одновременно
@laravelcreative3 жыл бұрын
Да)
@ИванДрачев-ы3у3 жыл бұрын
Курс очень понравился, но разве после 53 строки в Service.php уже не нужно Db::commit использовать? И полный код всего курса можно как-то получить?
@laravelcreative3 жыл бұрын
В апдейте тоже надо, просто в спешке делал и упустил момент. Но суть такая - старт транзакции, далее либо коммит, либо роллбек.
@ИванДрачев-ы3у3 жыл бұрын
@@laravelcreative , понял). Спасибо. А как насчет выложить код ?
@laravelcreative3 жыл бұрын
@@ИванДрачев-ы3у это не входит в план
@bogdankhorvat94422 жыл бұрын
кoooмент для продвижения! like подписка
@laravelcreative2 жыл бұрын
Благодарю!)
@yuriisenenko47962 жыл бұрын
А почему не использовал firstOrCreate?
@АлександрКопылов-и5г Жыл бұрын
У кого возникает 500 ошибка при посте, то допишите весь код как по видео до 23 минуты и статус сменится на 201
@evgeniysergeev27082 жыл бұрын
Если кто-то будет продолжать этот урок после перезапуска ларавела в штроме, перегенерирйте токен. Он будет другим.
@GoshaLebowski Жыл бұрын
У меня возник вопрос! Почему при указание route в группе, postman выдаёт мне 401. Если вне группы то статус 200 Route::group(['namespace' => 'App\Http\Controllers\Post', 'middleware' => 'jwt.auth'], function () { Route::get('/posts', 'IndexController'); Route::get('/posts/create', 'CreateController'); Route::post('/posts', 'StoreController'); Route::get('/posts/{post}', 'ShowController'); Route::get('/posts/{post}/edit', 'EditController'); Route::patch('/posts/{post}', 'UpdateController'); Route::delete('/posts/{post}', 'DestroyController'); }); 401 Route::group(['namespace' => 'App\Http\Controllers\Post', 'middleware' => 'jwt.auth'], function () { Route::get('/posts', 'IndexController'); // Route::get('/posts/create', 'CreateController'); // Route::post('/posts', 'StoreController'); // Route::get('/posts/{post}', 'ShowController'); // Route::get('/posts/{post}/edit', 'EditController'); // Route::patch('/posts/{post}', 'UpdateController'); // Route::delete('/posts/{post}', 'DestroyController'); }); Route::get('/posts/{post}', [App\Http\Controllers\Post\ShowController::class, '__invoke']); 200 Почему он нормально в группе работать не может?
@Olegcowboyoleg10 ай бұрын
А для чего ему __invoke прописываешь? Вроде при обращении к классу этот метод самостоятельно вызывается. К нему не нужно обращаться.
@Olegcowboyoleg10 ай бұрын
У меня тоже выдает 401 ошибку. Требует авторизации, а как её сделать, если мы json отправляем? Почему-то у автора всё работает без авторизации или он о чем-то умалчивает за кадром. сделал без авторизации, вынес за рамки группировки Route::group(['namespace' => '', 'middleware' => 'jwt.auth'], function () { Route::get('/posts', IndexController::class); Route::get('/posts/create', CreateController::class); Route::get('/posts/{post}', ShowController::class); Route::get('/posts/{post}/edit', EditController::class); Route::patch('/posts/{post}', UpdateController::class); Route::delete('/posts/{post}', DestroyController::class); }); Route::post('/posts', StoreController::class);
@alexandersurname46342 жыл бұрын
Спасибо за уроки! Вот несколько рефакторингов. private function getCategoryIdWithUpdate($category) { return Category::firstOrCreate(['id' => $category['id'] ?? 0], $category)->id; } или private function getCategoryIdWithUpdate($category) { if (!isset($category['id'])) { return Category::create($category)->id; } Category::find($category['id'])->update($category); return $category['id']; } private function getCategoryId($category) { return !isset($category['id']) ? Category::create($category)->id : $category['id']; }
@eugene_kulik2 жыл бұрын
id = 0? так себе рефакторинг... 🤔
@eugene_kulik2 жыл бұрын
получение id можно так сократить: private function getCategoryId($category) { return $category['id'] ?? Category::create($category)->id; }
@alexandersurname46342 жыл бұрын
@@eugene_kulik так, а что будет?
@alexandersurname46342 жыл бұрын
@@eugene_kulik несущественное сокращение
@eugene_kulik2 жыл бұрын
@@alexandersurname4634 Id вообще нельзя вручную указывать, это автоинкремент, он должен заполняться автоматически базой. Если твой код выполнить два раза с созданием, то у тебя первый раз создастся элемент с id = 0, а второй раз перезапишится