Как использовать предопределенный метод уничтожения в laravel - PullRequest
0 голосов
/ 05 октября 2018

PLZ, не опускайте меня до следующего предложения, оставайтесь со мной ...

Интересно, как лучше удалить объект, сделанный из модели?Я видел несколько похожих вопросов, но никто не касался ни всей темы, ни моих подробностей.

Я хочу создать кнопку удаления, удаляющую определенный объект в laravel.Я знаю, как это сделать, но боюсь, что я слишком усложняю вещи.

Допустим, у меня есть модель с именем Post

У меня также есть контроллер PostController.Когда я сделал этот контроллер, я получил его.Благодаря этому у меня есть несколько методов, например.destroy

 /**
 * Remove the specified resource from storage.
 *
 * @param  \App\Post  $post
 * @return \Illuminate\Http\Response
 */
public function destroy(Post $post)
{
    //
}

Я немного запутался, как будто почему он дает мне подсказку типа Post , а также параметр $ post?Для меня было бы разумно, если бы в качестве параметра он принимал $ id.

НО снова и снова, я не Тай-Тай.Поэтому каждый раз, когда что-то не имеет смысла для меня, я думаю, что просто что-то упустил.Итак, с риском быть широким, как мне сделать кнопку удаления, которая использует предопределенный метод уничтожения?ищу ответ на эти три шага:

  1. HTML (Как сделать форму / кнопку)
  2. web.php (маршрут)
  3. PostController (Как выполнить уничтожение? Я знаю, как сделать это с идентификатором, но с целым объектом в качестве параметра? Как это вообще отправлено в первую очередь?)

еще раз извините за широкуюно я чувствую, что многие вопросы по этому поводу задаются в попытке быть конкретным, но недостаток знаний сужает вопрос до многих, поэтому он может упустить очевидные ответы.

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

передать еще один идентификатор параметра в ваш метод уничтожения

открытая функция destroy ($ id, Post $ post) {

$ post = $ post-> findOrFail ($ id);

if (! $ Post-> delete ()) {

 return Redirect::back()->withErrors($post->errors());

}

Flash :: success (self :: DELETE_MESSAGE);return Redirect :: back ();

}

0 голосов
/ 05 октября 2018

Из официальных документов Laravel:

Поскольку мы связали все параметры {user} с моделью App \ User, экземпляр User будет внедрен в маршрут.Так, например, запрос к profile / 1 внедрит экземпляр User из базы данных с идентификатором 1.

Если соответствующий экземпляр модели не найден в базе данных, ответ HTTP 404 будетавтоматически генерируется.

https://laravel.com/docs/5.7/routing#explicit-binding

0 голосов
/ 05 октября 2018

Они сделали это таким образом, просто чтобы быть более разумным.
Как не отставать от Object Oriented

И не волнуйтесь.даже если он имеет destroy(Post $post), вам не нужно предоставлять Post объект для этой destroy() функции.Вам нужно только пропустить id сообщения через request.остальные обрабатываются Laravel.

Laravel ищет в таблице сообщений сообщение с идентификатором, который вы передаете в запросе, извлекает этот объект сообщения и предоставляет его функции destroy().

Вам просто нужно позвонить delete().

public function destroy(Post $post)
{
    // laravel has found the post for you.
    $post->delete();
}

Давайте взглянем на ваш подход.
Вы можете изменить его на destroy($id)

public function destroy($id)
{
    // you have to find the particular post from database to delete.
    Post::where('id', $id)->delete();
}

Видите, это сложнее.

Итак, чтобы ответить на ваши 3 вопроса.

Форма

<form method="post" action="{{ route('post.destroy'), 1 }}">
    <!-- here the '1' is the id of the post which you want to delete -->

    {{ csrf_field() }}
    {{ method_field('DELETE') }}

    <button type="submit">Delete</button>
</form>

Маршрут

Route::resource('post', 'PostController');

Контроллер

public function destroy(Post $post)
{
    $post->delete();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...