如何在laravel中使用预定义的销毁方法

时间:2018-10-05 05:11:00

标签: php laravel routing

PLZ不要为我的下一句话投下赞成票,和我在一起...

我想知道从模型中删除对象的最佳实践方法吗? 我已经看到了几个类似的问题,但是没有人涉及到整个主题,也没有人介绍我的具体情况。

我想创建一个删除按钮,以删除laravel中的特定对象。我知道该怎么做,但是我担心事情太复杂了。

假设我有一个名为Post的模型

我也有控制器PostController。当我制作此控制器时,便获得了资源。因此,我准备了几种方法。摧毁

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

对于为什么会给我类型提示 Post 和$ post参数,我有些困惑。对我来说,如果将$ id作为参数,那将是有意义的。

但是一次又一次,我不是Tay-Tay。因此,每次我觉得没有意义时,我都会想念一些东西。因此,冒着泛滥的风险,我如何制作一个使用预定义销毁方法的删除按钮?正在寻找这三个步骤的答案:

  1. HTML(如何制作表单/按钮)
  2. web.php(路线)
  3. PostController(我如何执行销毁操作?我知道如何使用id而是以整个对象作为参数来执行此操作?什至一开始是怎么发送的?)

再次为之广泛而感到抱歉,但我感到很多有关此问题的问题都是为了具体化而提出的,但由于缺乏知识,问题被缩小了很多,因此可能会遗漏明显的答案。

3 个答案:

答案 0 :(得分:1)

他们这样做是为了更加明智。
喜欢跟上Object Oriented

不要担心。即使它具有destroy(Post $post),您也不必为此Post函数提供destroy()对象。您只需通过id传递帖子的request。其余的由Laravel处理。

Laravel在发布表中查找具有您在请求中传递的ID的发布,然后获取该发布对象并将其提供给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();
}

答案 1 :(得分:1)

来自Laravel官方文档:

  

由于我们已将所有{user}参数绑定到App \ User模型,因此   用户实例将被注入到路由中。因此,例如   对profile / 1的请求将从数据库注入User实例   其ID为1。

     

如果在数据库中找不到匹配的模型实例,则显示404 HTTP   响应将自动生成。

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

答案 2 :(得分:-1)

在您的destroy方法中再传递一个参数id

公共函数destroy($ id,Post $ post){

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

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

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

}

Flash ::成功(自己:: DELETE_MESSAGE);  return Redirect :: back();

}