首页 > 解决方案 > @can 指令问题 - laravel

问题描述

注册用户可以访问jobs.edit.blade.php

其中会计师可以访问一些复选框(仅对他可见)

根据会计师提交的复选框更改数据库值(布尔值)。

@can ('isAccountant')
//some code with checkboxes
@endcan

问题是,当注册用户访问jobs.edit.blade.php并提交(复选框不可见)时,数据库中的所有布尔值都变为零

我怎样才能避免这种情况

工作.edit.blade.php

@can ('isAccountant')
<div class="row">
  <div id="status">
     @if ($job->entered_status == '0')
      <input type="checkbox" name="entered_status" @if($job->entered_status) checked @endif> Entered <br><br>
     @elseif ($job->entered_status == '1')
      <input type="checkbox" name="entered_status" checked value="1" disabled> Entered <br><br>
      <input type='hidden' name='entered_status' value="1">
     @endif

    @if ($job->sales_status == '1')
      <input type="checkbox" name="despatch_status" checked value="1" disabled> All Despatches Completed <br><br>
      <input type="checkbox" name="invoice_status" checked value="1" disabled> All Invoices Completed
      <input type='hidden' name='despatch_status' value="1">
      <input type='hidden' name='invoice_status' value="1">
    @endif

    @if ($job->sales_status == '0' && $job->job_status == 'Completed' && $job->despatch_status == '0')
      <input type="checkbox" name="despatch_status" @if($job->despatch_status) checked @endif value="1"> All Despatches Completed <br><br>
    @endif

    @if ($job->sales_status == '0' && $job->job_status == 'Completed' && $job->despatch_status == '1')
      <input type="checkbox" name="despatch_status" checked value="1"> All Despatches Completed <br><br>
      <input type="checkbox" name="invoice_status" @if($job->invoice_status) checked @endif value="1"> All Invoices Completed <br><br>
    @endif
  </div>
</div>

@endcan

作业控制器.php

public function update(Request $request, $id)
    {


      $job = Job::find($id);
      $job->customer_name = $request->customer_name;
      $job->company_name = $request->company_name;
      $job->job_type = $request->job_type;
      $job->job_owner = $request->job_owner;
      $job->job_status = $request->job_status;
      $job->despatch_status = $request->has('despatch_status');
      $job->invoice_status = $request->has('invoice_status');
      if ($job->despatch_status == 1 && $job->invoice_status == 1) {
        $job->sales_status = 1;
      }
      $job->entered_status = $request->has('entered_status'); 

AuthServiceProvider.php

public function boot()
    {
        $this->registerPolicies();

        Gate::define('isAdmin', function ($user) {
          return $user->user_type == 'Admin';
        });

        Gate::define('isDirector', function ($user) {
          return $user->user_type == 'Director';
        });

        Gate::define('isProduction', function ($user) {
          return $user->user_type == 'Production';
        });

        Gate::define('isAccountant', function ($user) {
          return $user->user_type == 'Accountant';
        });


    }

扩展错误

_token  
"nzY5y8EW5yupkL3d6aL9bcpZRYmlc5YTN94ee1uI"
_method 
"PATCH"
id  
"10725"
customer_name   
""
company_name    
""
job_type    
"""
Item:\r\n
Qty:\r\n
Size:\r\n
Paper:\r\n
Print:\r\n
Each:\r\n
Total:
"""
job_owner   
"Sam"
job_status  
"Pending"
job_delivery_date   
""
job_delivery_time   
""
pk_pkl  
"PKL"
entered_status  
"on"

标签: laravelcheckboxauthorization

解决方案


这样做的原因是您正在使用:

$job->despatch_status = $request->has('despatch_status')

$request->has('despatch_status')如果请求有该字段,则为 true,如果请求没有字段,则为 false 。

我可以推荐的代码:

这将从despatch_status请求中获取 ,如果它的trueor false(或1/ 0)它将被传递给$job->despatch_status.

但是,如果请求despatch_status存在 ,->get()则将返回null,因此??操作员将读取数据库中已经存在的值,因此它不会改变。

$job->despatch_status = $request->get('despatch_status') ?? $job->despatch_status;

推荐阅读