Не получается добавить статью в базу, выдаёт ошибку PHP: (1/1) TokenMismatchException in VerifyCsrfToken.php line 68 at VerifyCsrfToken->handle(object(Request), object(Closure)) in Pipeline.php line 148 PHP: <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Article; use App\Http\Requests; use App\Http\Controllers\Controller; class ArticleController extends Controller { public function create(){ //$this->authorize('create'); // <---- вот это важная строчка return view('create'); } public function store(Request $request){ Article::create($request->all()); return redirect('/articles'); } } PHP: @extends('layouts.app') @section('content') <div class="container"> <form class="form-horizontal" method="POST" action='/store'> <label class="control-label">Название статьи</label> <input type="text" class="form-control" name="title"> <label class="control-label">Статья</label> <textarea class="form-control" ></textarea> <input type="hidden" value="{{csrf_token()}}"> <input class="btn btn-primary" type="submit" value="Создать"> </form> </div> @endsection Делаю во статье http://109.234.35.82/laravel-5-2-авторизация --- Добавлено --- Кажись разобрался, убрал скрытое поле токена и после открытия формы добавил {{ csrf_field() }}. Почему так?
@Dimon2x, с английским совсем плохо? Зачем читать статьи по старой версии, когда есть документация по новейшей, и там достаточно инфы для решения этих задач?
@mkramer нормально ли переводчик перевёл статью? https://translate.google.com/transl...el.com/docs/5.6/validation&edit-text=&act=url
@Dimon2x, вроде ничего, похоже. Но если ты не в состоянии прочитать без переводчика, то тебе следует прерваться и заняться английским. Не обязательно доводить до беглой речи (у меня её нет, если что), но основы грамматики должны быть крепкими. И надо много читать по-английски документации, чтоб наработать техническую лексику. --- Добавлено --- https://laravel.com/docs/master/csrf - по твоему вопросу, например, всё расписано для последнего Laravel --- Добавлено --- В 5.5 чуть-чуть по-другому было: https://laravel.com/docs/5.5/csrf --- Добавлено --- В 5.2 могло быть вообще по-другому
@igordata мне не нравится там обучение, там все задания решаются на угад, сайт подходит для тех, кто знал английский и его подзабыл. Мне нравится сайт 4 флага, там всё с объяснениями.
В новой версии Laravel можно просто в Blade вставить @csrf И убери _token с request при добавлении записи PHP: $request->except(['_token']) Это добавит все данные кроме значения _token аналогично у тебя такой колонки нет в БД
Учусь добавлять данные в базу, нормальный ли способ? Версия 5.6 PHP: Route::get('/create', 'ArticleController@index'); Route::post('/add-article', 'ArticleController@store'); PHP: <form action="{{ url('add-article') }}" method="POST" class="form-horizontal"> {{ csrf_field() }} <input type="hidden" name="created_by" value="{{Auth::id()}}"> <!-- Task Name --> <div class="form-group"> <label for="task-name" class="col-sm-3 control-label">Новая статья</label> <div class="col-sm-6"> @if ($errors->has('title')) <div class="alert alert-danger">Название должно быть длиной, не менее 10 символов и не более 40.</div> @endif <input type="text" name="title" id="task-name" class="form-control" > <br> @if ($errors->has('description')) <div class="alert alert-danger">Описание должно быть длиной, не менее 20 символов и не более 200</div> @endif <textarea rows=10 name="description" class="form-control"></textarea> </div> </div> <!-- Add Task Button --> <div class="form-group"> <div class="col-sm-offset-3 col-sm-6"> <button type="submit" class="btn btn-default"> <i class="fa fa-btn fa-plus"></i>Добавить статью </button> </div> </div> </form> PHP: public function store(Request $request) { if (Auth::check()) { $this->validate($request, [ 'title' => 'required|min:10|max:40', 'description' => 'required|min:20|max:200', ]); DB::table('articles')->insert( [ 'title' => $request->title, 'description' => $request->description, 'created_by' => $request->created_by, ] ); } else { return Redirect::back(); } } модели нету Сделал проверку Auth::check или лучше создать политику $user->can?
Ну модели нету - уже не правильно, даже если не используешь Eloquent (по хорошему, не надо лезть и в Eloquent из контроллера, надо выносить в сервисный слой, но лень часто), контроллер в базу лезть не должен. Валидацию можно делать прямо в конроллере, но настоящий Laravel-way - выносить её в классы запросов. Кстати, это очень удобно. https://laravel.com/docs/master/validation#form-request-validation По поводу Eloquent и сервисного слоя. Я делаю так. Сначала пишу всё в контроллере из лени, потом, если разрастается, выношу отдельно куда-нибудь. Суть в том, что в контроллере должно быть минимально логики всякой, иначе они становятся нечитаемыми, и много кода будет повторяться в системе.
Ты же вроде писал, что курсы @ElisDN (Дмитрия Елисеева) смотрел? Вот там описан идеальный подход к созданию всего. --- Добавлено --- У него и по Laravel есть
@mkramer у него уроки очень длинные и много воды. --- Добавлено --- @mkramer Добавил модель, всё работает, правильный ли подход? PHP: <?php namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\DB; class Article extends Model { protected $fillable = ['title', 'description', 'created_by']; public function addArticle($request) { DB::table('articles')->insert( [ 'title' => $request['title'], 'description' => $request['description'], 'created_by' => $request['created_by'], ] ); } } /////////////////////////////////////// public function store(Request $request) { if (Auth::check()) { $this->validate($request, [ 'title' => 'required|min:10|max:40', 'description' => 'required|min:20|max:200', ]); $addArticle = new Article($request->all()); $addArticle->addArticle($request->all()); } else { return Redirect::back(); } }
@Dimon2x, ты доку читал? Бред же пишешь. Если ты унаследовал модель от Eloquent, то там уже сохранение готово, тебе не нужно писать самому. Если по какой-либо причине ты не хочешь использовать Eloquent, тогда и не наследуйся от него. --- Добавлено --- Не спиши писать код, сначала разбери документацию. Не можешь на английском, заморочься, поищи, может кто перевёл уже на русский последнюю. Я всегда читаю английскую, потому что мне всё равно, англ. или русский. --- Добавлено --- Что у тебя вообще по php прочитано? По ООП? Задрстра - must read для каждого, кто хочет ООП писать на php.
@mkramer Не понимаю, почему, если в Article не передать $request->all(), то будет ошибка Поле 'title' не имеет значения по умолчанию? PHP: class Article extends Model { protected $fillable = ['title', 'description', 'created_by']; } PHP: $addArticle = new Article; //$addArticle = new Article($request->all()); $addArticle->save();
@Dimon2x, это от твоей базы зависит. Ты его поставил, что его можно в null устанавливать, или не поставил, есть там default value или нету.
Если значение поменять на другое id то присвоим вообще другому пользователю. Лучше в контроллере получать id юзера PHP: <input type="hidden" name="created_by" value="{{Auth::id()}}"> PHP: Auth::user()->id
PHP: $article = new \App\Article; $article->title = 1; $article->description = 2 auth()->user()->articles()->save($article) // hasMany //еще есть эвенты можно прям в моделе добавлять public static function boot() { parent::boot(); self::creating(function ($model) { $model->user_id = auth()->user()->id; }); } //ну и много всего другого setCreatedAtAttribute
creating = при добавлении записи в бд есть еще другие эвенты вот пример с документации там создается новый файл. у меня пример как это делать в модели (файл Article.php) https://laravel.com/docs/5.6/eloquent#events PHP: $article = new \App\Article; $article->title = 1; $article->description = 2; $article->save()