Laravel 5.7 использует одно и то же действие URL для вставки и обновления с помощью @yield в шаблоне блейда

Я использую laravel 5.7 и использую одну форму для вставки и обновления. В действии формы я хочу использовать @yield() для маршрута laravel, чтобы получить идентификатор для обновления. Все в порядке, но я не могу использовать метод @yield(). Вот мой код, проблема только в действии формы.

   <form class="form-horizontal" action="{{ url('/todo/@yield('editId')') }}" method="post">
        {{csrf_field()}}
        @section('editMethod')
            @show
        <fieldset>
            <div class="form-group">
                <div class="col-lg-10">
                    <input type="text" name="title" placeholder="Title" value="@yield('editTitle')" class="form-control">
                </div>
            </div>

            <div class="form-group">
                <div class="col-lg-10">
                    <textarea class="form-control" placeholder="Body" name="body" rows="5" id="textarea">@yield('editBody')</textarea>
                    <br>
                    <button type="submit" class="btn btn-success">Submit</button>
                </div>
            </div>
        </fieldset>
    </form>

Я также проверил с одинарными и двойными кавычками.

 action="/todo/@yield('editid')"

Когда я использую простой этот метод, то после отправки он перенаправляет меня на локальный хост, и страница с ошибкой не найдена. В ларавеле 5.4 это работает. но не в ларавеле 5.7. Будем признательны за любую помощь. Спасибо.

Вот мой edit.blade.php, из которого я использую @section и @yield

  @extends('Todo.create')

  @section('editId',$item->id)
  @section('editTitle',$item->title)
  @section('editBody',$item->body)

  @section('editMethod')
   {{ method_field("PUT") }}
  @endsection

Методы редактирования и обновления хранилища контроллера

   public function store(Request $request)
{
    $todo = new todo;
    $this->validate($request,[
        'body'=>'required',
        'title'=>'required|unique:todos',
    ]);
    $todo->body = $request->body;
    $todo->title = $request->title;
    $todo->save();
    return redirect("todo");
}

 public function edit($id)
{  
    $item = todo::find($id);
    return view("Todo.edit",compact('item'));
}

public function update(Request $request, $id)
{
    $todo = todo::find($id);
    $this->validate($request,[
        'body'=>'required',
        'title'=>'required',
    ]);
    $todo->body = $request->body;
    $todo->title = $request->title;
    $todo->save();
    return redirect("/todo");
}

person Akhtar Munir    schedule 17.11.2018    source источник
comment
@section и @yield предназначены для разделов HTML. Не используйте его для простых строковых переменных. Просто передайте сами переменные   -  person apokryfos    schedule 17.11.2018
comment
editId, на который я ссылаюсь из edit.balde.php, откуда я передаю идентификатор, подобный этому $item-›id, это идентификатор, и я хочу передать его маршруту для обновления   -  person Akhtar Munir    schedule 17.11.2018
comment
Я никогда не видел использования o@yield в URL-адресе, нет возможности хранить и обновлять с использованием одного и того же URL-адреса, потому что laravel хранит данные, используя метод store в контроллере, и обновляет данные, используя методы edit и update.   -  person Ram Bhandari    schedule 17.11.2018
comment
Пожалуйста, покажите нам свой контроллер и маршрут, с помощью которого вы открываете этот блейд-файл. Я хотел бы ответить на это немного подробнее, но было бы проще с дополнительным кодом. Вы явно неправильно поняли концепцию директив лезвия.   -  person TimSch    schedule 17.11.2018
comment
Я согласен с вами, но я использовал методы редактирования, хранения и обновления в контроллере. Я получил данные и все такое, см. Я обновил вопрос.   -  person Akhtar Munir    schedule 17.11.2018
comment
Как вы назвали файл, содержащий первый код (в котором вы используете yield)?   -  person TimSch    schedule 17.11.2018
comment
Хорошо, позвольте мне показать контроллер, я использую маршруты ресурсов, вы можете знать об этом   -  person Akhtar Munir    schedule 17.11.2018
comment
Я использовал вот так @section('editId',$item-›id)   -  person Akhtar Munir    schedule 17.11.2018
comment
Route::resource('todo','todocontroller'); содержит все маршруты   -  person Akhtar Munir    schedule 17.11.2018
comment
Пожалуйста, отредактируйте свой вопрос и не размещайте его в комментариях. Наиболее важной частью будет код контроллера.   -  person TimSch    schedule 17.11.2018
comment
Проверьте обновленный код, добавлен код контроллера @TimSch   -  person Akhtar Munir    schedule 17.11.2018


Ответы (2)


Чтобы ответить на фактический вопрос OP, вам нужно будет сделать

@section('editId', "/$item->id") or @section('editId', '/'.$item->id')

{{ url('/todo') }}@yeild('editId')

Но гораздо лучше сделать

{{ url('/todo/'.(isset($item) ? $item->id : '')) }}

Или для PHP >= 7

{{ url('/todo/'.($item->id ?? '')) }}
person justrusty    schedule 17.11.2018
comment
{{ url('/todo') }}/@yield('editId') это работает для меня, но это работает для обновления, а не для вставки, и когда я удаляю это / и ставлю его с помощью todo/, оно работает для вставки, но не для обновления - person Akhtar Munir; 17.11.2018
comment
@AkhtarMunir обновил ответ, чтобы исправить эту проблему. При вставке вы можете оставить раздел editId или ввести пустую строку. - person justrusty; 17.11.2018

Как уже упоминалось в apokryfos, считается, что @yield упрощает повторное использование ваших шаблонов.
Если вы просто хотите определить (например), какое действие следует вызывать после этого, вам лучше сделать что-то вроде этого:

@extends('Todo.create')
<form class="form-horizontal" action="/todo/{{ isset($item) ? $item->id : '' }}" method="post">
        @if( ! isset($item))
           {{ method_field("PUT") }}
        @else
           {{ method_field("PATCH") }}

        {{csrf_field()}}
        <fieldset>
            <div class="form-group">
                <div class="col-lg-10">
                    <input type="text" name="title" placeholder="Title" value="{{ isset($item) ? $item->title : '' }}" class="form-control">
                </div>
            </div>

            <div class="form-group">
                <div class="col-lg-10">
                    <textarea class="form-control" placeholder="Body" name="body" rows="5" id="textarea">{{ isset($item) ? $item->body : '' }}</textarea>
                    <br>
                    <button type="submit" class="btn btn-success">Submit</button>
                </div>
            </div>
        </fieldset>
</form>  

Кроме того, насколько я помню, поле метода всегда должно быть первым, чтобы убедиться, что оно правильно распознано. Кроме того, я думаю, вам не нужен url() для создания URL-адреса. Нет необходимости во втором лезвии. Просто введите переменные непосредственно в шаблон и убедитесь, что они установлены, прежде чем обращаться к ним. Я не пробовал, но я думаю, что это должно работать.

person TimSch    schedule 17.11.2018
comment
спасибо, братан, но у меня это не работает, потому что я попадаю на локальный хост, я должен использовать URL с этим, как упомянул $justrusty - person Akhtar Munir; 17.11.2018