Asked Mar 26th, 12:10 AM 68 0 1
  • 68 0 1
0

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

Share
  • 68 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}', '[email protected]')->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 ANSWERS


Answered Mar 26th, 3:04 AM
0
 Route::get('/edit/{id}', '[email protected]')->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)
Share
Yoshin @nhoxhocju
Mar 26th, 6:53 AM

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ỉ?

0
| Reply
Share