How can I delete a post resource in laravel 5?
Solution 1
I don't know how to do it with the static class Form but I found this problem some days ago using only HTML code.
This doesn't work:
<form action="{{ action('Controller@destroy') }}" method="DELETE">
...
</form>
This works fine:
<form action="{{ action('Controller@destroy') }}" method="POST">
<input type="hidden" name="_method" value="DELETE">
...
</form>
Sources:
- 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
Solution 2
how to send form by post applied to users:
View:
<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:
Route::group(['middleware' => 'web'], function () {
Route::delete('/home/destroy',[
'as'=> 'home.destroy',
'uses'=> 'homeController@destroy',
]);
});
Controller:
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() is only to prevent a user deletes another and Auth::logout() is to clear user data in the session if you do not work with users will not need them, you must use == not === to compare $id and Auth::user()->id, $id works as string, and Auth::user()->id works as number.
This way is equivalent to using get with this code:
View:
<li><a href="{{ url('/home/delete', Auth::user()->id) }}"><i class="fa fa-btn fa-sign-out"></i>Delete user</a></li>
Route:
Route::group(['middleware' => 'web'], function () {
Route::get('/home/delete/{id}', 'homeController@delete');
});
Controller:
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');
}
}
M dunbavan
I am a self-employed web developer living and working in London.
Updated on July 09, 2022Comments
-
M dunbavan almost 2 years
Laravel 5 version
I am working on a project with the new laravel 5 release and for some reason i cannot delete a post, when I press delete it just redirects me to the post show page with the id such as /post/3 and I get a blank white page, when I go back to index view I get all the posts and that one has not been deleted. Here is what I have below:
Posts migration file
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.'); } } }
As far as i am aware, this is okay but I think its the delete method that is screwing with it all. In my routes file I have the route resources set up so in
php artisan
to display routes I can see the destroy route like so:| | 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
Post form with delete button
In here I have got a simple button that tells the form to delete the resource from the index list and take it from the table.
{!! Form::open(array('class' => 'form-inline', 'method' => 'DELETE', 'route' => array('posts.destroy', $post->id))) !!} <li> <img src="{!! $post->featured_image !!}" alt="" /> <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() !!}
What I am getting is nothing, no post gets deleted at all. Any answers or points to the right place would be awesome.