Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么我被重定向到显示而不是破坏路线_Php_Laravel_Laravel 4_Routing - Fatal编程技术网

Php 为什么我被重定向到显示而不是破坏路线

Php 为什么我被重定向到显示而不是破坏路线,php,laravel,laravel-4,routing,Php,Laravel,Laravel 4,Routing,当我尝试注销时,我从show路径进入函数,而不是destroy路径 这是视图中的注销按钮: @if (Auth::check()) <li> {{ HTML::linkRoute('account.destroy', 'Logout', Auth::user()->id) }} </li> @endif 以及显示和销毁功能: public function show($id) { $user = User::find($id)->fi

当我尝试注销时,我从
show
路径进入函数,而不是
destroy
路径

这是视图中的注销按钮:

@if (Auth::check())
  <li>
    {{ HTML::linkRoute('account.destroy', 'Logout', Auth::user()->id) }}
  </li>
@endif
以及
显示
销毁
功能:

public function show($id)
{
    $user = User::find($id)->first();

    return View::make('account.visit_profile')->with('user', $user);
}

public function destroy($id)
{
    Auth::logout();
    Session::flush();

    return Redirect::route('home');
}
如果我将
show
放在
资源
路径的例外中,并为注销创建一条路径:

Route::get('/account/logout', [
    'as'   => 'account.destroy',
    'uses' => 'AccountController@destroy'

]);
然后我仍然被重定向到
show
功能


我不明白为什么会这样。

对于一个资源丰富的控制器,为
show
路由和
destroy
路由生成的URL是相同的,唯一的区别是用于访问它们的HTTP谓词。使用GET请求访问
show
方法,使用DELETE请求访问
destroy
方法。这两种方法相当于:

Route::get('account/{account}', ['as' => 'account.show', 'uses' => 'AccountController@show']);
Route::delete('account/{account}', ['as' => 'account.destroy', 'uses' => 'AccountController@destroy']);
HTML锚定标记只能执行GET请求,因此无法通过HTML锚定标记访问
destroy
操作。该链接将指向“account/{account}”url,但它将使用GET请求,从而将您带到
show
方法

基本解决方案是,您需要一个表单来提交POST请求,而不是HTML链接,该表单包含一个隐藏字段“\u method”,其值为“DELETE”。这里有几个选项

  • 自己写表格

    @if (Auth::check())
        <li>
            {{ Form::open(['route' => ['account.destroy', Auth::user()->id], 'method' => 'delete']) }}
                {{ Form::submit('Logout') }}
            {{ Form::close() }}
        </li>
    @endif
    
    @if(Auth::check())
    
  • {{Form::open(['route'=>['account.destroy',Auth::user()->id],'method'=>'delete'])} {{Form::submit('Logout')} {{Form::close()}}
  • @恩迪夫
    如果需要,可以使用CSS使表单/提交按钮看起来像一个链接

  • 使用javascript库为您执行此操作。有几个版本的称为“restfulizer.js”的小库在那里浮动。另一个选项是rails jquery ujs库(在rails之外工作)。这些库背后的主要思想是,您所做的只是向HTML锚定标记添加一个新的数据属性,库将负责为您生成和提交表单。例如,如果加载了这两个库中的任何一个,则代码如下所示:

    @if (Auth::check())
        <li>
            {{ HTML::linkRoute('account.destroy', 'Logout', Auth::user()->id, ['data-method' => 'DELETE']) }}
        </li>
    @endif
    
    @if(Auth::check())
    
  • {{HTML::linkRoute('account.destroy','Logout',Auth::user()->id,['data-method'=>'DELETE']}
  • @恩迪夫
    这就是你所需要的。javascript将处理其余部分

  • @if (Auth::check())
        <li>
            {{ HTML::linkRoute('account.destroy', 'Logout', Auth::user()->id, ['data-method' => 'DELETE']) }}
        </li>
    @endif