如何在 laravel 5 中删除帖子资源?

Posted

技术标签:

【中文标题】如何在 laravel 5 中删除帖子资源?【英文标题】:How can I delete a post resource in laravel 5? 【发布时间】:2015-04-22 11:24:38 【问题描述】:

Laravel 5 版本

我正在使用新的 laravel 5 版本开发一个项目,由于某种原因,我无法删除帖子,当我按下删除时,它只会将我重定向到 ID 为 /post/3 的帖子显示页面,我得到了一个空白的白页,当我返回索引视图时,我得到了所有帖子,并且那个帖子还没有被删除。这是我下面的内容:

帖子迁移文件

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;

class CreatePostsTable extends Migration 

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::create('posts', function(Blueprint $table)
        
            $table->increments('id');
            $table->string('title')->default('');
            $table->string('slug')->default('');
            $table->text('body');
            $table->integer('author_id');
            $table->string('author');
            $table->string('featured_image');
            $table->softDeletes();
            $table->timestamps();
        );
    


    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        Schema::drop('posts');
    


PostsController

use Input;
use Redirect;
use Storage;
use SirTrevorJs;
use STConverter;
use Validator;
use Image;
use Boroughcc\Post;
use Boroughcc\Http\Requests;
use Boroughcc\Http\Controllers\Controller;

use Illuminate\Http\Request;

class PostsController extends Controller 
    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index()
    
        $posts = Post::all();
        return view('posts.index', compact('posts'));
    
    /**
     * Update the specified resource in storage.
     *
     * @param  int  $id
     * @return Response
     */
    public function update(Post $post)
    
        //
        $this->middleware('auth');
        $input = array_except(Input::all(), '_method');
        $post->update($input);

        return Redirect::route('posts.show', $post->slug)->with('message', 'Post updated.');
    
    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return Response
     */
    public function destroy(Post $post)
    
        //
        //$post = Post::findOrFail($id);
        $post->delete();
        if($post->delete())  
            return Redirect::route('posts.index')->with('message', 'Post deleted.');
        
    


据我所知,这没关系,但我认为删除方法搞砸了这一切。在我的路线文件中,我设置了路线资源,因此在php artisan 中显示路线我可以看到销毁路线,如下所示:

|        | GET|HEAD                       | posts                                                 | posts.index   | Boroughcc\Http\Controllers\PostsController@index                 |            |
|        | GET|HEAD                       | posts/create                                          | posts.create  | Boroughcc\Http\Controllers\PostsController@create                |            |
|        | POST                           | posts                                                 | posts.store   | Boroughcc\Http\Controllers\PostsController@store                 |            |
|        | GET|HEAD                       | posts/posts                                         | posts.show    | Boroughcc\Http\Controllers\PostsController@show                  |            |
|        | GET|HEAD                       | posts/posts/edit                                    | posts.edit    | Boroughcc\Http\Controllers\PostsController@edit                  |            |
|        | PUT                            | posts/posts                                         | posts.update  | Boroughcc\Http\Controllers\PostsController@update                |            |
|        | PATCH                          | posts/posts                                         |               | Boroughcc\Http\Controllers\PostsController@update                |            |
|        | DELETE                         | posts/posts                                         | posts.destroy | Boroughcc\Http\Controllers\PostsController@destroy

使用删除按钮发布表单

在这里,我有一个简单的按钮,告诉表单从索引列表中删除资源并从表中获取它。

!! Form::open(array('class' => 'form-inline', 'method' => 'DELETE', 'route' => array('posts.destroy', $post->id))) !!
                    <li>
                        <img src="!! $post->featured_image !!"  />
                        <a href=" route('posts.show', $post->id) "> $post->title </a>
                    </li>
                    (
                        !! link_to_route('posts.edit', 'Edit', array($post->slug), array('class' => 'btn btn-info')) !!,
                        !! Form::submit('Delete', array('class' => 'btn btn-danger')) !!
                    )
                !! Form::close() !!

我得到的是什么,根本没有帖子被删除。任何指向正确位置的答案或点都很棒。

【问题讨论】:

你试过使用 forceDelete() 吗?您确定依赖注入正在正确检索帖子吗?如果您只执行“return $post;”会发生什么就在 $post->delete() 之前?它返回正确的模型吗? 【参考方案1】:

你想在这里使用Route model binding。

你可以去你的app/Providers/RouteServiceProvider.php文件中的boot方法并添加int:

$router->bind('posts','Boroughcc\Post');

告诉 laravel posts 参数(在你提供的route:list 中可见) should be bound to thePost` 模型(Laravel 默认使用 id)

或者您可以在app/Http/routes.php 中使用:

Router::bind('posts','Boroughcc\Post');

【讨论】:

嗨,Marcin,我的路线文件中有这个:Route::model('posts', 'Post'); Route::resource('posts', 'PostsController'); Route::bind('posts', function($value, $route) return Post::whereSlug($value)-&gt;first(); ); 这仍然不起作用,因为您可以看到路线已经到位 @Mdunbavan 因此,请尝试在 destroy 方法中检查 $post 内部的内容:dd($post-&gt;toArray()); 好的,所以它给了我 post 数组,这很好,但 deleted_at 显然没有填写 array:10 [▼ "id" =&gt; 3 "title" =&gt; "Project 3" "slug" =&gt; "project-3" "body" =&gt; "cddcddc" "author_id" =&gt; 0 "author" =&gt; "" "featured_image" =&gt; "/private/var/folders/mf/srx7jt8s2rdg0mn5hr98cvz80000gn/T/phpZb0VAC" "created_at" =&gt; "2015-02-07 17:17:31" "updated_at" =&gt; "2015-02-16 13:54:53" "deleted_at" =&gt; null ] @Mdunbavan 你添加到你的Post 模型:use SoftDeletes; 了吗?此外,现在您在控制器的destroy 方法中运行了两次delete 方法【参考方案2】:

我不知道如何使用静态类 Form 来解决此问题,但几天前我只使用 html 代码就发现了这个问题。

这不起作用:

<form action=" action('Controller@destroy') " method="DELETE">
...
</form>

这很好用:

<form action=" action('Controller@destroy') " method="POST">
    <input type="hidden" name="_method" value="DELETE">
    ...
</form>

来源:

http://laravel.io/forum/01-19-2015-delete-route-doesnt-work-page-not-found https://laracasts.com/discuss/channels/general-discussion/how-to-updatedelete-using-forms-and-restful-controllers

【讨论】:

【参考方案3】:

要删除模型,请执行此操作

$model -> find($id);
$model -> delete();

或者干脆

$model -> destroy($id);

删除多行

$model -> destroy ([1,2,3]);

【讨论】:

【参考方案4】:

如何通过邮寄方式向用户发送表单:

查看:

<form class="" action=" url('/home/destroy') " method="post">
  <li><button type="submit"><i class="fa fa-btn fa-sign-out"></i>Destroy user</button></li>
  <input type="hidden" name="id" value="Auth::user()->id">
   method_field('DELETE') 
  !! csrf_field() !!
</form>

路线:

Route::group(['middleware' => 'web'], function () 
 Route::delete('/home/destroy',[
  'as'=> 'home.destroy',
  'uses'=> 'homeController@destroy',
 ]);
);

控制器:

use app\User;
use Illuminate\Support\Facades\Auth;

protected function destroy(Request $request)

  $id= $request->id;
  if (Auth::user()->id == $id)
    $user= User::find($id);
    $user-> delete();
    Auth::logout();
    return redirect()->route('welcome');
  else
    return redirect()->route('home');
  

if() 仅用于防止用户删除另一个用户,而 Auth::logout() 用于清除会话中的用户数据比较$id和Auth::user()->id,$id作为字符串,Auth::user()->id作为数字。

这种方式等价于使用get这个代码:

查看:

<li><a href=" url('/home/delete', Auth::user()->id) "><i class="fa fa-btn fa-sign-out"></i>Delete user</a></li>

路线:

Route::group(['middleware' => 'web'], function () 
  Route::get('/home/delete/id', 'homeController@delete');
);

控制器:

protected function delete($id)

  if (Auth::user()->id == $id)
    $user= User::find($id);
    $user-> delete();
    Auth::logout();
    return redirect()->route('welcome');
  else
    return redirect()->route('home');
  

【讨论】:

以上是关于如何在 laravel 5 中删除帖子资源?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 5.8 中获取关注用户的帖子

如何在 laravel 5.2 中只显示最新的帖子,而且没有 html <p> 标签?

如何在 Laravel 中实现“用户只能编辑自己的帖子/模型”

如何在 Laravel 5.6 中检查 @if 语句中的当前 URL

如何在 Laravel 5.2 中使用资源声明路由

Laravel 5.5 模型上的自定义软删除