How can I delete a post resource in laravel 5?

23,706

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:

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');
  }
}
Share:
23,706
M dunbavan
Author by

M dunbavan

I am a self-employed web developer living and working in London.

Updated on July 09, 2022

Comments

  • M dunbavan
    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.