Laravel 5.4 редактировать пост не работает

Я новичок в Laravel, и я не понимаю, как сделать формы действий и маршрутизацию для редактирования поста

Вот мои маршруты —

    Route::post('/menu', 'MenuController@store');

Route::resource('/menu', 'MenuController');

вот контроллер —

    public function update(Request $request, $id)
{
$this->validate($request, [
'menuName' => 'required',
'menuLink' => 'required'
]);

//create new menu

return $id;//   $menus->name = $request->input('menuName');
//$menus->link = $request->input('menuLink');
//$menus->save();

//return redirect('/menu')->with('success', 'Menu updated');
}

Возврат $ id предназначен для проверки того, что «id» даст мне, а он мне — «{id}»

вот форма —

    <form action = "/menu/{id}" method = "POST">
{{ csrf_field() }}
<input name = "_method" type = "hidden" value = "PUT">
<input type="text" id="menuName" name="menuName" class="input-block-level" placeholder="Menu name">
<input type="text" id="linkName" name="menuLink" class="input-block-level" placeholder="Menu link ">
<button type="submit" class="btn btn-success pull-right">Submit</button>
</form>

Я действительно все испортил и не знаю, что я делаю неправильно. Я не могу понять, почему функция обновления возвращает мне «{id}», а не значение идентификатора, и как я могу сделать так, чтобы все это работало

0

Решение

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

Измените форму действия с
action = "/menu/{id}"

в

action = "/menu/".$id"

или вы можете использовать лезвие Laravel

Form::open(['route' => ['menu.update', $id]])

и не забудьте закрыть форму в конце

 {!!Form::close!!}
0

Другие решения

Вы сделали что-то не так с action приписывать. Измените это на:
action="/menu/{{ $id }}"

0

Хорошо,

у вас есть метод редактирования, который будет показывать форму, этот метод должен вернуть объект меню

public function update($id)
{
// get the menu you wan to edit
$menu = Menu::find($id);
// return the form with the menu object
return view('your.form.view', compact('menu'));
}

Теперь форма должна быть такой

// use that object u returned in the form action
<form action = "/menu/{{ $menu->id }}" method = "POST">
{{ csrf_field() }}
<input name = "_method" type = "hidden" value = "PUT">
<input type="text" id="menuName" name="menuName" class="input-block-level" placeholder="Menu name">
<input type="text" id="linkName" name="menuLink" class="input-block-level" placeholder="Menu link ">
<button type="submit" class="btn btn-success pull-right">Submit</button>
</form>

Теперь метод обновления должен быть примерно таким

public function update(Request $request, $id)
{
$this->validate($request, [
'menuName' => 'required',
'menuLink' => 'required'
]);
// update the data
$bool = Menu::where('id',$id)->update([
'menuName'=> $request->menuName,
'menuLink'=> $request->menuLink,
]);
if(!$bool){
Session::flash('alert','error');
return view('page.index');
}
Session::flash('alert','success');
return view('page.index');
}

Этот первый метод — «get» edit, который должен показывать форму,
вторая — это обновление, которое должно получить данные из формы (после метода show) и использовать i для обновления.

0

Я решил ошибку —

в обновлении лезвия перед формой я добавил foreach

    <div class="container">
<div class="row">
@foreach($menus as $menus)
<form action="/menu/{{$menus->id}}" method="POST">
@endforeach
{{ csrf_field() }}
<input name = "_method" type = "hidden" value = "PUT">
<input type="text" id="menuName" name="menuName" class="input-block-level" placeholder="Menu name">
<input type="text" id="linkName" name="menuLink" class="input-block-level" placeholder="Menu link ">
<button type="submit" class="btn btn-success pull-right">Submit</button>
</form>

</div>
</div>

Но сейчас он редактирует только 1-й пост и не имеет значения, какой пост он редактирует.

вот контроллер —

    public function edit($id)
{
$menus = Menu::all();
return view('admin.editmenu')->with('menus', $menus);
}

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

//create new menu

$menus = Menu::find($id);

$menus->name = $request->input('menuName');
$menus->link = $request->input('menuLink');
$menus->save();

return redirect('/menu')->with('success', 'Menu updated');
}

лезвие списка меню —

    @if(count($menus) > 1)
@foreach($menus as $menus)
<tr>
<th scope="row">1</th>
<td>{{$menus->name}}</td>
<td>{{$menus->link}}</td>
<td>{{$menus->created_at}}</td>
<td>{{$menus->updated_at}}</td>
<td>
<button type = "button"class = "btn btn-outline-danger btn-sm">Delete</button>
<a href = "/menu/{{$menus->id}}/edit" class = "btn btn-outline-warning btn-sm">Edit</button>
</td>
</tr>
@endforeach
@else
0

Хорошо, я понял и решил.

Начну с маршрутов

маршруты ———-

    Route::resource('menu', 'MenuController');

этот почтовый маршрут был ненужным, но это ни на что не повлияло

контроллер ——-

     public function edit($id)
{
$menus = Menu::find($id);
return view('admin.editmenu')->with('menus', $menus);
}

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

//create new menu

$menus = Menu::find($id);

$menus->name = $request->input('menuName');
$menus->link = $request->input('menuLink');
$menus->save();

return redirect('/menu')->with('success', 'Menu updated');
}

Где в функции редактирования я должен найти идентификатор, который нужно редактировать

список меню ——————

    @if(count($menus) > 1)
@foreach($menus as $menu)
<tr>
<th scope="row">1</th>
<td>{{$menu->name}}</td>
<td>{{$menu->link}}</td>
<td>{{$menu->created_at}}</td>
<td>{{$menu->updated_at}}</td>
<td>
<button type = "button"class = "btn btn-outline-danger btn-sm">Delete</button>
<a href = "/menu/{{$menu->id}}/edit" class = "btn btn-outline-warning btn-sm">Edit</button>
</td>
</tr>
@endforeach
@else
<p class = "well"> No menu items created!</p>
@endif

Для ясности я изменил только $ menus как $ menus в $ menus as $ menu.

редактировать лезвие ————

    @extends('admin.main')

@section('content')

<div class="container">
<div class="row">

<form action="/menu/{{$menus->id}}" method="POST">
{{ csrf_field() }}
<input name = "_method" type = "hidden" value = "PUT">
<input type="text" id="menuName" name="menuName" class="input-block-level" placeholder="Menu name" value="{{ $menus->name }}">
<input type="text" id="linkName" name="menuLink" class="input-block-level" placeholder="Menu link " value="{{ $menus->link }}">
<button type="submit" class="btn btn-success pull-right">Submit</button>
</form>

</div>
</div>

@endsection

Здесь я удалил @foreach, как сказал @Snapey, и добавил параметр value.
Я думаю, что значение параметра всегда давало мне ошибки.

Спасибо всем за внимание и желание помочь! Надеюсь, что когда-нибудь я смогу помочь другим своими знаниями.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector