Laravel Delete не работает - PullRequest
0 голосов
/ 08 мая 2018

Как видно из названия, я не могу заставить работать опцию delete (). Я пробовал много постов в Интернете, но правильного ответа просто не было. Я использую Laravel 5.5 с Homestead (установленной неделю назад, последние версии или около того).

Позвольте мне дать вам немного кода, и я очень надеюсь, что кто-нибудь сможет мне помочь.

Это вызывает у меня головную боль, и оланзапин заканчивается. Пожалуйста, скажите мне, что я делаю не так, и если чего-то не хватает, пожалуйста, дайте мне знать!

Я хочу удалить страницу как администратор, но я, кажется, Laravel не авторизует меня и выдает мне эту ошибку:

    protected function methodNotAllowed(array $others)
{
    throw new MethodNotAllowedHttpException($others);
}

Это мой контроллер:

    <?php

namespace App\Http\Controllers\Admin;

use Auth;
use App\Page;
use App\Http\Requests\WorkWithPage;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class PagesController extends Controller
{
    public function __construct() {
        $this->middleware('admin');
        $this->middleware('can:manageUsers,App\User');
    }
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        if (Auth::user()->isAdmin()) {
            $pages = Page::paginate(20);
        } else {
            $page = Auth::user()->pages()->paginate(5);
        }
        return view('admin.pages.index', ['pages' => $pages]);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view('admin.pages.create')->with(['model' => new Page()]);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(WorkWithPage $request)
    {
        Auth::user()->pages()->save(new Page($request->only([
            'title','url','content'])));

            return redirect()->route('pages.index')->with('status', 'Pagina succesvol aangemaakt');
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Page  $page
     * @return \Illuminate\Http\Response
     */
    public function edit(Page $page)
    {
        if(Auth::user()->cant('update', $page)){
            return redirect()->route('pages.index')->with('status', 'Pagina succesvol aangepast');
        } 

        return view('admin.pages.edit', ['model' => $page]);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Page  $page
     * @return \Illuminate\Http\Response
     */
    public function update(WorkWithPage $request, Page $page)
    {
        if(Auth::user()->cant('update', $page)){
            return redirect()->route('pages.index')->with('status', 'Dat mag jij niet');
        } 

        $page->fill($request->only([
            'title','url','content'
        ]));

        $page->save();

        return redirect()->route('pages.index')->with('status', 'Pagina succesvol aangepast');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Page  $page
     * @return \Illuminate\Http\Response
     */
    public function destroy(Page $page)
    {
        if(Auth::user()->cant('delete', $page)){
            return redirect()->route('pages.index')->with('status', 'Hey knul! Pssst! Wegwezen!');
        }

        $page->id->delete();

        return redirect()->route('pages.index')->with('status', 'Page has been deleted.');
    }
}

И это моя индексная страница (индекс как в админ-индексе для бэкенда:

 @extends('layouts.app') @section('content')
<div class="container">
    @if (session('status'))
    <div class="alert alert-info">
        {{ session('status') }}
    </div>
    @endif
    <a href="{{ route('pages.create')}}" class="btn btn-primary">Nieuwe pagina</a>
    <br>
    <br>
    <table class="table">
        <thead>
            <tr>
                <th>Naam</th>
                <th>URL</th>
                <th>Opties</th>
            </tr>
        </thead>

        @foreach($pages as $page)
        <tr>
            <td>
                <a href="{{ route('pages.edit', ['page' => $page->id]) }}">{{ $page->title }}</a>
            </td>
            <td>{{ $page->url }}</td>
            <td class="text-right">
                <a href="{{ route('pages.destroy', ['page' => $page->id])}}" class="btn btn-danger delete-link" data-message="Are you sure you want to delete this page?"
                    data-form="delete-form">
                    Delete
                </a>
            </td>
        </tr>
        @endforeach
    </table>
    {{$pages->links()}}
</div>
<form id="delete-form" action="" methode="POST">
        {{method_field('DELETE')}} 
        {!! csrf_field() !!}
    </form>
@endsection

Тогда есть маршруты:

   <?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

Auth::routes();

Route::get('/admin', function() {
    return view('admin.index');
})->middleware('admin');

Route::resource('/admin/pages', 'Admin\PagesController', ['except' => ['show']]);

Route::resource('/admin/blog', 'Admin\BlogController', ['except' => ['show']]);

Route::resource('/admin/users', 'Admin\UsersController', ['except' => ['create', 'store', '']]);

Route::get('/home', 'HomeController@index')->name('home');

Тогда полис:

    <?php

namespace App\Policies;

use App\User;
use App\Page;
use Illuminate\Auth\Access\HandlesAuthorization;

class PagePolicy
{
    use HandlesAuthorization;

    public function before($user, $ability) {
        if ($user->isAdmin()) {
            return true;
        }
    }
    /**
     * Determine whether the user can update the page.
     *
     * @param  \App\User  $user
     * @param  \App\Page  $page
     * @return mixed
     */
    public function update(User $user, Page $page)
    {
        return $user->id = $page->user_id;
    }

     /**
     * Determine whether the user can delete the page.
     *
     * @param  \App\User  $user
     * @param  \App\Page  $page
     * @return mixed
     */
    public function delete(User $user, Page $page)
    {
        return $user->id = $page->user_id;
    }
}

И, наконец, промежуточное ПО:

    <?php

namespace App\Http\Middleware;

use Closure;
use Auth;

class AccessAdmin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(Auth::check() && Auth::user()->hasAnyRole(['Super Admin','Admin'])) {
            return $next($request);
        }

        return redirect('login');
    }
}

Обновление: исправлено!

В представлении, которое я изменил:

            @foreach($model as $post)
        <tr>
            <td>
                <a href="{{ route('blog.edit', ['post' => $post->id]) }}">{{ $post->title }}</a>
            </td>
            <td>{{ $post->user()->first()->name }}</td>
            <td>{{ $post->slug }}</td>
            <td class="text-right">
                <a href="{{ route('blog.destroy', ['blog' => $post->id])}}" class="btn btn-danger delete-link" data-message="Are you sure you want to delete this page?"
                    data-form="delete-form">
                    Delete
                </a>
            </td>
        </tr>
        @endforeach
    </table>
    {{$model->links()}}
</div>
<form id="delete-form" action="#" methode="POST">
        {{ method_field('DELETE') }}
        {!! csrf_field() !!}
</form>

Кому:

        @foreach($pages as $page)
    <tr>
        <td>
            <a href="{{ route('pages.edit', ['page' => $page->id]) }}">{{ $page->title }}</a>
        </td>
        <td>{{ $page->url }}</td>
        <td class="text-right">
            <form action="{{ route('pages.destroy', ['page' => $page->id]) }}" method="POST" class="btn btn-danger delete-link" >
                <input type="submit" value="delete"/>
                {{method_field('DELETE')}} 
                {!! csrf_field() !!}
            </form>
        </td>
    </tr>
    @endforeach
</table>
{{$pages->links()}}

1 Ответ

0 голосов
/ 09 мая 2018

Не уверен, с чего начать ... Во-первых, вы получаете исключение, потому что вы отправляете неправильный метод в URL. (Я никогда не делаю так), но, вероятно, вы отправляете GET, когда ожидаете POST (с перезаписью DELETE). Вы неправильно назвали «метод», это должен быть «метод». Дальше ... не уверен, что это пропало $page->id->delete(); ... может быть $page->delete(). Как совет - возможно, будет лучше использовать !can() вместо cant(). Разницы нет, но cant() может в какой-то момент запутать вас. И я рад, что кто-то использует метод ->fill(), но вы можете столкнуться с небольшой проблемой при работе с флажками. Проверьте это: https://github.com/LaraModulus/admin-core/blob/master/src/traits/HelpersTrait.php

...