Yêu cầu Mar 26th, 2021 12:10 a.m. 163 0 1
  • 163 0 1
0

[Laravel] Hỏi về Policy trong laravel ạ!

Chia sẻ
  • 163 0 1

Chào mọi người, mình đang gặp chút vấn đề khi sử dụng policy trong middleware và authorizeResource Đó là khi mình gọi policy trong middleware như sau:

 Route::get('/edit/{id}', 'CategoryController@edit')->middleware('can:update,category')->name('edit');

hoặc trong controller mình khai báo ở construct() như sau:

public function __construct(
        Category $_category,
        CategoryRepositoryInterface $category,
        Tag $tag
    ) {
        $this->_category = $_category;
        $this->category = $category;
        $this->tag = $tag;
        $this->authorizeResource(Category::class);
    }

Nó đều lỗi không chạy vô cái function update của policy khi mình truy cập vào function edit($id) của controller Và nó chỉ bị với function có cần models thui, còn những function policy nào không cần models thì ko bị! (Những function ko cần models được khi báo ở hàm resourceMethodsWithoutModels trong AuthorizesRequest.php)

Mình vào viewAny, view, create thì ok, nhưng cứ vào edit, delete là lỗi. Nó ko chạy vô cái policy update của mình luôn! vì mình thử chỉ bỏ return $this->deny('Truy cập bị từ chối') để test xem nó có vô function update ko và mình thấy nó ko vô!

Còn đây là hàm CategoryPolicy function update của mình:

public function update(?User $user, Category $category)
    {
        $permissions = $user->hasPermissions('categories.index', 'edit');

        if (Auth::user()->status == '1' && $permissions != false && $permissions->edit != null && $permissions->edit == '1') {
            return true;
        } else {
            return $this->deny('Truy cập bị từ chối!');
            //false;
        }
    }

Minh dùng thủ công từng function trong controller dùng:

$this->authorize('update', Post::class);

thì lại chạy được! Mong mọi người giúp đỡ tại sao nó ko vô dc với middleware và authorizeResource.

1 CÂU TRẢ LỜI


Đã trả lời Mar 26th, 2021 3:04 a.m.
0
 Route::get('/edit/{id}', 'CategoryController@edit')->middleware('can:update,category')->name('edit');

Thằng này bạn muốn dùng thì phải xài route binding, với matching params, tức là cái {id} của bạn phải là {category} vì bạn đang cố gọi update,category

Ngoài ra đảm bảo cái hàm edit đang Inject category

public function edit(Request $request, Category $category)
Chia sẻ
Avatar Yoshin @nhoxhocju
Mar 26th, 2021 6:53 a.m.

Bạn có thể viết rõ ra được ko? Mình thử đổi {id} thành {category} rùi nhưng vẫn ko dc Ngoài ra đảm bảo cái hàm edit đang Inject category vô ??? Cái này cụ thể là làm gì bạn nhỉ?

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí