Сделать кнопку отправки данных в базу данных (пустая страница работает при перезагрузке?) - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть система CRUD, которая позволяет пользователям создавать, редактировать и удалять свои собственные социальные группы.Затем эти группы отображаются на общедоступной странице, и другие пользователи могут просматривать и присоединяться к социальным группам.

Система create_group работает отлично, и группы отображаются на общедоступной странице.Информация хранится в таблице базы данных groups.

. Я хочу, чтобы пользователи могли нажимать кнопку «Присоединиться к группе» и записывать group_title в базу данных.

идея состоит в том, что они могут затем просматривать группы, к которым они присоединились позже, со своей панели инструментов.

Я не уверен на 100%, как поступить, поскольку я новичок в кодировании.Моим инстинктом было создать еще одну CRUD-систему под названием Join, но это возможно излишне?

Я предпринял следующие шаги:

  1. Создана таблица базы данных с именем 'Joins'

  2. Создана система CRUD, такая же, как CRUD «Создать группу». Полагаю, я просто не буду использовать функции редактирования или создания этого CRUD.

  3. Я разместил эту кнопку на странице, доступной для общего доступа:

<form method="post" action="{{ route('join.store') }}">
    <input type="submit" name="{{ $group->group_title }}" value="Join Group" class="btn btn-success" />
</form>

При нажатии кнопки происходит что-то очень странное, я перехожу на правильную страницу http://version2.test/join, но страница пуста, и на ней отображается

Страница просрочена

ошибка.Однако, если я обновлю страницу или даже скопирую URL на новую страницу, она будет отображаться правильно!?

Кроме того, при просмотре http://version2.test/join я не вижу отображения заголовка группы.

UPDATE # 1 - затем я добавил @csrf к кнопке следующим образом:

<form method="post" action="/test">
    @csrf
    <input type="hidden" name="group_title" value="{{ $group->group_title }}">
    <input type="submit" value="Join Group" class="btn btn-success" />
</form>

Сначала я думал, что это исправило ошибку «Срок действия страницы истек», но позже понял,что это не так.Кнопка «Присоединиться к группе» по-прежнему указывает на http://version2.test/join, но на странице отображается ошибка «Срок действия страницы истек».Однако, если я обновлю страницу или даже скопирую URL на новую страницу, она будет отображаться правильно.

JoinController.php

<?php

namespace App\Http\Controllers;

use App\Join;
use Illuminate\Http\Request;

// All join pages require login except 'show'
class JoinController extends Controller
{

    public function __construct()
    {
        $this->middleware('auth', ['except' => 'show']);
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $join = Join::all();

        return view('join/index', compact('join'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view('join.create');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $request->validate([
            'group_title' => 'required',
            // 'group_description' => 'required',
            // 'group_date' => 'required',
            // 'group_time' => 'required',
        ]);

        $join = new Join([
            'group_title' => $request->get('group_title'),
            // 'group_description' => $request->get('group_description'),
            // 'group_date' => $request->get('group_date'),
            // 'group_time' => $request->get('group_time'),
        ]);
        $join->save();
        return redirect('/join')->with('success', 'Group joined!!');
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        $join = Join::find($id);
        return view('join.show', compact('join'));
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        $join = Join::find($id);
        return view('join.edit', compact('join'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $request->validate([
            'group_title' => 'required',
            // 'group_description' => 'required',
            // 'group_date' => 'required',
            // 'group_time' => 'required',
        ]);

        $join = Join::find($id);
        $join->group_title =  $request->get('group_title');
        // $group->group_description = $request->get('group_description');
        // $group->group_date = $request->get('group_date');
        // $group->group_time = $request->get('group_time');
        $join->save();
        return redirect('/join')->with('success', 'Group joined!');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        $join = Join::find($id);
        $join->delete();

        return redirect('/join')->with('success', 'Unjoined!');
    }
}

Join.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Join extends Model
{
    protected $fillable = [
        'group_title',
        // 'group_description',
        // 'group_date',
        // 'group_time',
    ];
}

join/index.blade.php

<tbody>
    @foreach($join as $join)
    <tr>
        <td>
            <a href="{{ route('group_join.show',$group->id)}}">{{$group->group_title}}</a>
        </td>
        <td>
            <a href="{{ route('group_join.edit', $group->id)}}" class="btn btn-sm btn-warning">Edit</a>
        </td>
        <td>
            <form action="{{ route('group_join.destroy', $group->id)}}" method="post">
                @csrf
                @method('DELETE')
                <button class="btn btn-sm btn-danger" type="submit">Delete</button>
            </form>
        </td>
    </tr>
    @endforeach
</tbody>

routes/web.php

Route::resource('join', 'JoinController');

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Страница просрочена 419

Это означает, что маршрут join.store находится под промежуточным программным обеспечением VerifyCsrfToken, которое защищает ваше приложение от атаки подделки межсайтовых запросов и данные опубликованной формы имеютнет (или недействительно) _token

Все, что вам нужно сделать, это добавить токен CSRF, также вы ничего не публикуете, поэтому вы получаете перенаправление из проверки

<form method="post" action="/test">
    @csrf
    <input type="hidden" name="group_title" value="{{ $group->group_title }}">
    <input type="submit" value="Join Group" class="btn btn-success" />
</form>

ТакжеВы не правильно создаете модель

Обновление: не перенаправляйте, если не создаете группу

$joined = Join::create([
                 'group_title' => $request->get('group_title')
          ]);
if ($joined) {
   return redirect('/join')->with('success', 'Group joined!!');
}
return response->json(['status' => 'Failed to create group']);

Другой вариант - отключить защиту для маршрута в промежуточном ПО (это полезнодля тестов API с Почтальоном)

НЕ ДЕЛАЙТЕ ЭТОГО

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    /**
     * Indicates whether the XSRF-TOKEN cookie should be set on the response.
     *
     * @var bool
     */
    protected $addHttpCookie = true;

    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        '/join/store' // Place the routes you want to exclude here
    ];
}

Обратите внимание, если ваша версия Laravel ниже 5.6

, используйте вместо этого

{{ csrf_field() }}

Или вручную создал ввод

<input type="hidden" name="_token" value="{{ csrf_token() }}">

Узнать больше

0 голосов
/ 27 сентября 2019

Если это форма, вы можете проверить, сработает ли замена 'group_title' => $request->get('group_title') на 'group_title' => $request->input('group_title'), в вашем методе store.

Поскольку это поле является обязательным, и вы не получаете сообщение об ошибке, данные передаются вашему действию.Проверьте, работает ли это.[через https://laraveldaily.com/differences-request-get-vs-request-input-vs-helper-vs-get_data/]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...