За последние 24 часа нас посетили 18678 программистов и 1625 роботов. Сейчас ищут 1303 программиста ...

Создание статьи

Тема в разделе "Laravel", создана пользователем Dimon2x, 19 май 2018.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.209
    Симпатии:
    185
    Не получается добавить статью в базу, выдаёт ошибку
    PHP:
    1. (1/1) TokenMismatchException
    2. in VerifyCsrfToken.php line 68
    3. at VerifyCsrfToken->handle(object(Request), object(Closure))
    4. in Pipeline.php line 148
    PHP:
    1. <?php
    2.  
    3. namespace App\Http\Controllers;
    4.  
    5. use Illuminate\Http\Request;
    6. use App\Article;
    7. use App\Http\Requests;
    8. use App\Http\Controllers\Controller;
    9.  
    10. class ArticleController extends Controller
    11. {
    12.    
    13.     public function create(){
    14.         //$this->authorize('create'); // <---- вот это важная строчка
    15.         return view('create');
    16.     }
    17.     public function store(Request $request){
    18.         Article::create($request->all());
    19.         return redirect('/articles');
    20.         }
    21.  
    22.  
    23. }
    PHP:
    1. @extends('layouts.app')
    2. @section('content')
    3. <div class="container">
    4.      <form class="form-horizontal" method="POST" action='/store'>
    5.           <label class="control-label">Название статьи</label>
    6.           <input type="text" class="form-control"  name="title">
    7.           <label class="control-label">Статья</label>
    8.           <textarea class="form-control" ></textarea>
    9.           <input type="hidden" value="{{csrf_token()}}">
    10.          <input class="btn btn-primary" type="submit" value="Создать">
    11.     </form>
    12. </div>
    13. @endsection
    Делаю во статье http://109.234.35.82/laravel-5-2-авторизация
    --- Добавлено ---
    Кажись разобрался, убрал скрытое поле токена и после открытия формы добавил {{ csrf_field() }}.

    Почему так?
     
  2. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    name="_token"
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    @Dimon2x, с английским совсем плохо? Зачем читать статьи по старой версии, когда есть документация по новейшей, и там достаточно инфы для решения этих задач?
     
  4. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.209
    Симпатии:
    185
    @mkramer а можно ссылки на новые статьи?
     
  5. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.209
    Симпатии:
    185
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    @Dimon2x, вроде ничего, похоже. Но если ты не в состоянии прочитать без переводчика, то тебе следует прерваться и заняться английским. Не обязательно доводить до беглой речи (у меня её нет, если что), но основы грамматики должны быть крепкими. И надо много читать по-английски документации, чтоб наработать техническую лексику.
    --- Добавлено ---
    https://laravel.com/docs/master/csrf - по твоему вопросу, например, всё расписано для последнего Laravel
    --- Добавлено ---
    В 5.5 чуть-чуть по-другому было: https://laravel.com/docs/5.5/csrf
    --- Добавлено ---
    В 5.2 могло быть вообще по-другому
     
    Dimon2x нравится это.
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  8. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.209
    Симпатии:
    185
    @igordata мне не нравится там обучение, там все задания решаются на угад, сайт подходит для тех, кто знал английский и его подзабыл.

    Мне нравится сайт 4 флага, там всё с объяснениями.
     
  9. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Полиглот. Выучим англ за 16 часов. Мне понравилось.
     
  10. S_t_e_e_p

    S_t_e_e_p Активный пользователь

    С нами с:
    12 июл 2012
    Сообщения:
    181
    Симпатии:
    4
    В новой версии Laravel можно просто в Blade вставить @csrf
    И убери _token с request при добавлении записи

    PHP:
    1. $request->except(['_token'])
    Это добавит все данные кроме значения _token аналогично у тебя такой колонки нет в БД
     
  11. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.209
    Симпатии:
    185
    Учусь добавлять данные в базу, нормальный ли способ? Версия 5.6

    PHP:
    1. Route::get('/create', 'ArticleController@index');
    2. Route::post('/add-article', 'ArticleController@store');
    PHP:
    1. <form action="{{ url('add-article') }}" method="POST" class="form-horizontal">
    2.                         {{ csrf_field() }}
    3.                         <input type="hidden" name="created_by" value="{{Auth::id()}}">
    4.  
    5.                         <!-- Task Name -->
    6.                         <div class="form-group">
    7.                             <label for="task-name" class="col-sm-3 control-label">Новая статья</label>
    8.  
    9.                             <div class="col-sm-6">
    10.                                  @if ($errors->has('title'))
    11.                                     <div class="alert alert-danger">Название должно быть длиной, не менее 10 символов и не более 40.</div>
    12.                                  @endif
    13.                                 <input type="text" name="title" id="task-name" class="form-control" >
    14.                                 <br>
    15.                                 @if ($errors->has('description'))
    16.                                     <div class="alert alert-danger">Описание должно быть длиной, не менее 20 символов и не более 200</div>
    17.                                  @endif
    18.                                 <textarea rows=10 name="description" class="form-control"></textarea>
    19.                             </div>
    20.                         </div>
    21.  
    22.                         <!-- Add Task Button -->
    23.                         <div class="form-group">
    24.                             <div class="col-sm-offset-3 col-sm-6">
    25.                                 <button type="submit" class="btn btn-default">
    26.                                     <i class="fa fa-btn fa-plus"></i>Добавить статью
    27.                                 </button>
    28.                             </div>
    29.                         </div>
    30.                     </form>
    PHP:
    1. public function store(Request $request)
    2.     {
    3.        if (Auth::check()) {
    4.         $this->validate($request, [
    5.              'title' => 'required|min:10|max:40',
    6.              'description' => 'required|min:20|max:200',
    7.  
    8.          ]);
    9.  
    10.         DB::table('articles')->insert( [
    11.             'title' => $request->title,
    12.             'description' => $request->description,
    13.             'created_by' => $request->created_by,
    14.             ] );
    15.         }
    16.      
    17.        else {
    18.             return Redirect::back();
    19.         }
    20.     }
    модели нету

    Сделал проверку Auth::check или лучше создать политику
    $user->can?
     
    #11 Dimon2x, 23 май 2018
    Последнее редактирование: 23 май 2018
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    Ну модели нету - уже не правильно, даже если не используешь Eloquent (по хорошему, не надо лезть и в Eloquent из контроллера, надо выносить в сервисный слой, но лень часто), контроллер в базу лезть не должен. Валидацию можно делать прямо в конроллере, но настоящий Laravel-way - выносить её в классы запросов. Кстати, это очень удобно. https://laravel.com/docs/master/validation#form-request-validation

    По поводу Eloquent и сервисного слоя. Я делаю так. Сначала пишу всё в контроллере из лени, потом, если разрастается, выношу отдельно куда-нибудь. Суть в том, что в контроллере должно быть минимально логики всякой, иначе они становятся нечитаемыми, и много кода будет повторяться в системе.
     
  13. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.209
    Симпатии:
    185
    @mkramer а можешь скинуть ссылку на хороший репозиторий, с примером простого сайта на laravel?
     
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    Не, я примеров не использовал, а репы моих проектов я не имею права показывать
     
  15. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.209
    Симпатии:
    185
    @mkramer Что бы придумать свой двигатель, желательно изучить уже существующие.
     
  16. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    Ты же вроде писал, что курсы @ElisDN (Дмитрия Елисеева) смотрел? Вот там описан идеальный подход к созданию всего.
    --- Добавлено ---
    У него и по Laravel есть
     
  17. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.209
    Симпатии:
    185
    @mkramer у него уроки очень длинные и много воды.
    --- Добавлено ---
    @mkramer Добавил модель, всё работает, правильный ли подход?

    PHP:
    1. <?php
    2.  
    3. namespace App;
    4.  
    5. use Illuminate\Database\Eloquent\Model;
    6. use Illuminate\Support\Facades\DB;
    7.  
    8. class Article extends Model
    9. {
    10.     protected $fillable = ['title', 'description', 'created_by'];
    11.    
    12.     public function addArticle($request)
    13.     {
    14.      
    15.          DB::table('articles')->insert( [
    16.             'title' => $request['title'],
    17.             'description' => $request['description'],
    18.             'created_by' => $request['created_by'],
    19.             ] );
    20.     }
    21. }
    22.  
    23.  
    24.  
    25. ///////////////////////////////////////
    26. public function store(Request $request)
    27.     {
    28.        if (Auth::check()) {
    29.         $this->validate($request, [
    30.              'title' => 'required|min:10|max:40',
    31.              'description' => 'required|min:20|max:200',
    32.  
    33.          ]);
    34.        
    35.         $addArticle = new Article($request->all());
    36.         $addArticle->addArticle($request->all());
    37.      
    38.         }
    39.      
    40.        else {
    41.             return Redirect::back();
    42.         }
    43.     }
     
  18. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    @Dimon2x, ты доку читал? Бред же пишешь. Если ты унаследовал модель от Eloquent, то там уже сохранение готово, тебе не нужно писать самому. Если по какой-либо причине ты не хочешь использовать Eloquent, тогда и не наследуйся от него.
    --- Добавлено ---
    Не спиши писать код, сначала разбери документацию. Не можешь на английском, заморочься, поищи, может кто перевёл уже на русский последнюю. Я всегда читаю английскую, потому что мне всё равно, англ. или русский.
    --- Добавлено ---
    Что у тебя вообще по php прочитано? По ООП? Задрстра - must read для каждого, кто хочет ООП писать на php.
     
    Dimon2x нравится это.
  19. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.209
    Симпатии:
    185
    @mkramer Не понимаю, почему, если в Article не передать $request->all(), то будет ошибка Поле 'title' не имеет значения по умолчанию?

    PHP:
    1. class Article extends Model
    2. {
    3.     protected $fillable = ['title', 'description', 'created_by'];
    4.    
    5. }


    PHP:
    1. $addArticle = new Article;
    2.         //$addArticle = new Article($request->all());
    3.         $addArticle->save();
     
  20. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    @Dimon2x, это от твоей базы зависит. Ты его поставил, что его можно в null устанавливать, или не поставил, есть там default value или нету.
     
  21. S_t_e_e_p

    S_t_e_e_p Активный пользователь

    С нами с:
    12 июл 2012
    Сообщения:
    181
    Симпатии:
    4
    Если значение поменять на другое id то присвоим вообще другому пользователю.

    Лучше в контроллере получать id юзера
    PHP:
    1. <input type="hidden" name="created_by" value="{{Auth::id()}}">
    PHP:
    1. Auth::user()->id
     
    Dimon2x нравится это.
  22. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    PHP:
    1. $article = new \App\Article;
    2. $article->title = 1;
    3. $article->description = 2
    4. auth()->user()->articles()->save($article) // hasMany
    5. //еще есть эвенты можно прям в моделе добавлять
    6. public static function boot() {
    7.     parent::boot();
    8.     self::creating(function ($model) {
    9.         $model->user_id = auth()->user()->id;
    10.     });
    11. }
    12. //ну и много всего другого setCreatedAtAttribute
     
    Dimon2x нравится это.
  23. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.209
    Симпатии:
    185
    @nospiou типа при обращении к модели, boot будет автоматически загружаться?
     
  24. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    creating = при добавлении записи в бд есть еще другие эвенты вот пример с документации там создается новый файл. у меня пример как это делать в модели (файл Article.php)
    https://laravel.com/docs/5.6/eloquent#events
    PHP:
    1. $article = new \App\Article;
    2. $article->title = 1;
    3. $article->description = 2;
    4. $article->save()