首页 > 解决方案 > 在按钮单击 Laravel 时从视图中切换数据库值

问题描述

我使用 Laravel 框架作为后端 API 和一些用于前端的刀片式 PHP 文件,特别是用于 /admin 路由的身份验证和管理面板。在 /admin 中,我显示了所有注册用户的列表和他们旁边的按钮。(此页面仅对在 Admin 列中将其值设置为 true 的用户可见)。我想切换用户的管理员状态,通过单击用户名旁边的按钮来提升或降级他们。为此,我尝试使用带有 get 方法的表单提交。我在 UserController 中定义了一个方法,如下所示:

public function setAdmin($id) {
    $user = User::find($id);
    $user->admin = !$user->admin;
    if($user->save()) {
        echo "Changed";
    }
    else {
        echo "Could not be changed";
    }
}

我想通过单击按钮从视图中调用此方法。

我尝试使用表单通过指定操作来发送请求,但它给出了一个错误,指出传递的值小于预期的参数数量。

{!! Form::open(['action' => ['UserController@setAdmin', $user->id], 'method' => 'POST']) !!}
{{  Form::submit('Submit', ['class' => 'btn btn-primary']) }}
{!! Form::close() !!}

我有一个明确设置的路线来调用这个动作

Route::post('/admin/users/setAdmin', 'UserController@setAdmin')

虽然我不确定是否必须为此操作设置显式路由,或者是否可以直接从视图调用控制器函数而不定义路由。

我已经遍历用户模型以显示所有用户:

@if(count($users) > 0) 
    @foreach($users as $user)
        <div class="card">
            {{ $user }}
        </div>


        {!! Form::open(['action' => ['UserController@setAdmin', $user->id], 'method' => 'POST']) !!}
        {{  Form::submit('Submit', ['class' => 'btn btn-primary']) }}
        {!! Form::close() !!}
    @endforeach
@else 
    <h2>No users found!</h2>
@endif

编辑:添加了刀片文件的 foreach 部分。我还修改了 Form::open() 参数的“操作”部分,这是一个错误类型,参数错误仍然存​​在。

有人可以解释如何做到这一点吗?

标签: phplaravel

解决方案


您正在尝试将参数传递给您的路线,但其声明中有任何参数。您需要将其添加到您的路由路径中:

Route::post('/admin/users/setAdmin/{id}', 'UserController@setAdmin')

如果你不想有这样的 URL,你应该在包含你 ID 的表单中添加一个隐藏的输入:

{!! Form::open(['action' => ['UserController@setAdmin'], 'method' => 'POST']) !!}

{{ Form::hidden('id', $user->id) }}
{{ Form::submit('Submit', ['class' => 'btn btn-primary']) }}

{!! Form::close() !!}

在你的控制器的方法中:

use Request;

/* ... */

public function setAdmin(Request $request) {
    $user = User::find($request->id);

    /* ... */
}

推荐阅读