如何在 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 the
Post` 模型(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)->first(); );
这仍然不起作用,因为您可以看到路线已经到位
@Mdunbavan 因此,请尝试在 destroy
方法中检查 $post
内部的内容:dd($post->toArray());
好的,所以它给了我 post 数组,这很好,但 deleted_at 显然没有填写 array:10 [▼ "id" => 3 "title" => "Project 3" "slug" => "project-3" "body" => "cddcddc" "author_id" => 0 "author" => "" "featured_image" => "/private/var/folders/mf/srx7jt8s2rdg0mn5hr98cvz80000gn/T/phpZb0VAC" "created_at" => "2015-02-07 17:17:31" "updated_at" => "2015-02-16 13:54:53" "deleted_at" => 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.2 中只显示最新的帖子,而且没有 html <p> 标签?
如何在 Laravel 中实现“用户只能编辑自己的帖子/模型”