【问题标题】:Laravel Controller Function shows success but does not workLaravel 控制器功能显示成功但不起作用
【发布时间】:2019-08-23 08:47:30
【问题描述】:

您好,我有一个名为 deactivate 的控制器功能,如果我单击一个按钮,它应该执行此功能:

public function deactivate($id)
    {
        $user = User::find($id);
        $user->verified = false;
        $user->save();
        return redirect('/adminmodul')->with('success', 'Nutzer wurde erfolgreich deaktiviert');
    }

在我看来,按钮看起来是这样的:

<td><a href="{{ route('adminmodul.deactivate',$user->id)}}" class="btn btn-primary"><i class="fas fa-eye"></i></a></td>

这是我的路线:

Route::patch('/adminmodul/{id}',[
    'as' => 'adminmodul.deactivate',
    'uses' => 'AdminController@deactivate'
]);

每次点击按钮我都会收到成功消息,但什么也没发生,我不知道为什么

我可以向你展示我的完整控制器:

<?php

namespace App\Http\Controllers;
use App\User;
use App\Angebot;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;

class AdminController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {

    $angebote = DB::table('angebots')->first();
    $users = DB::table('users')->get();
    return view('adminmodul.index', compact('users', 'angebote'))
        ->with('i', (request()->input('page', 1) - 1) * 5);
}

/**
 * Show the form for creating a new resource.
 *
 * @return \Illuminate\Http\Response
 */
public function create()
{
    return view('adminmodul.create');
}

/**
 * Store a newly created resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function store(Request $request)
{
    //
}

/**
 * Display the specified resource.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function show($id)
{
}

/**
 * Show the form for editing the specified resource.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function edit($id)
{
    $user = User::find($id);

    return view('adminmodul.edit', compact('user'));
}

/**
 * Update the specified resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function update(Request $request, $id)
{
    $request->validate([
        'name'=>'required',

    ]);
    $user = User::find($id);
    $user->name = $request->get('name');
    $user->save();
    return redirect('/adminmodul')->with('success', 'Benutzer wurde geändert');
}

/**
 * Remove the specified resource from storage.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function destroy($id)
{
    $user = User::find($id);
    $angebot = Angebot::where('firma', $id);
    $angebot->delete();
    $user->delete();

    return redirect('/adminmodul')->with('success', 'Nutzer wurde erfolgreich gelöscht');
}


public function deactivate($id)
{

    $user = User::find($id);
    $user->verified = false;
    $user->save();

   return redirect('/adminmodul')->with('success', 'Nutzer wurde erfolgreich deaktiviert');
}
}

还有我的路线:

Route::resource('/adminmodul', 'AdminController');
Route::get('/adminmodul/{id}', 'AdminController@deactivate')->name('adminmodul.deactivate');

我不知道我做错了什么??因为我一直都这样做

这是我的餐桌用户:

【问题讨论】:

  • verified 的数据类型是什么?
  • 类型为布尔型
  • 保存数据后打印 $user 得到什么
  • 我该怎么做?
  • 确保您的$user-&gt;id 不为空。

标签: laravel controller routes


【解决方案1】:

尝试使用:

public function deactivate($id)
{
    $user = User::find($id);
    $user->verified = false;
    $user->save();
    return redirect('/adminmodul')->with('success', 'Nutzer wurde erfolgreich deaktiviert');
}

【讨论】:

    【解决方案2】:

    检查 id 是否真的在控制器中被接收。执行 dd($id) 来检查控制器函数是否收到了 id。

    public function deactivate($id)
    {
        dd($id)
        //rest of your code
    }
    

    【讨论】:

      【解决方案3】:

      你需要确保你的id不为空,使用findOrFail()方法:

      public function deactivate($id)
      {
          $user = User::findOrFail($id);
          $user->verified = false;
          $user->save();
      
         return redirect('/adminmodul')->with('success', 'Nutzer wurde erfolgreich deaktiviert');
      }
      

      将您的路线更改为put

      Route::put('/adminmodul/{id}', 'AdminController@deactivate')->name('adminmodul.deactivate');
      

      你应该把这条路线放在resource路线之前:

      Route::put('/adminmodul/{id}', 'AdminController@deactivate')->name('adminmodul.deactivate');
      Route::resource('/adminmodul', 'AdminController');
      

      当你使用 resource 路由时,laravel 会为这个 url /adminmodul/{id} 创建一个路由。这可能与您创建的路线冲突。查看here 了解更多信息。

      因此,您应该在声明 resource 路由之前放置您创建的路由,或者您可以更改 url 以避免冲突:

      Route::put('/adminmodul/deactivate/{id}', 'AdminController@deactivate')->name('adminmodul.deactivate');
      

      【讨论】:

        【解决方案4】:

        赋值后需要保存,

        public function deactivate($id)
            {
                $user = User::find($id);
                $user->verified = false;
                $user->save();  // add this line 
                return redirect('/adminmodul')->with('success', 'Nutzer wurde erfolgreich deaktiviert');
            }
        

        如下所示更新您的路线,

        Route::get('/adminmodul/{id}', 'AdminController@deactivate')->name('adminmodul.deactivate');
        
        Route::resource('/adminmodul', 'AdminController');
        

        【讨论】:

        • 你检查你的路线是否真的达到了你的方法?
        • 是还是? Route::patch('/adminmodul/{id}',[ 'as' => 'adminmodul.deactivate', 'uses' => 'AdminController@deactivate' ]);
        • 为什么你使用补丁请求而不是获取请求?更改路线补丁以获取并查看会发生什么。
        • 还是一样的:/
        • 如果您的路线符合您的方法,那么它应该可以工作。确保您的路线通过 dd('hit') 或类似的方法命中该方法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-26
        • 2016-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多