আমি প্রতি কাস্টম পোস্ট ধরণের নির্দিষ্ট কিছু RESTUL ক্রিয়া সীমাবদ্ধ করার লক্ষ্য রাখছি। উদাহরণস্বরূপ, একটি ভোকাবুলারি কাস্টম পোস্ট ধরণের দেওয়া, আমি বলতে চাই:
অনুমতি ম্যাট্রিক্স
+-------+---+----------+
|index | X | GET |
|show | O | GET |
|create | X | POST |
|update | X | PATCH/PUT|
|delete | X | DELETE |
+-------+---+----------+
ভি 2 এটি নিয়ন্ত্রণের স্তর সরবরাহ করে না বলে মনে হচ্ছে। আমি উত্সটি পেরিয়ে গিয়েছি এবং যা দেখতে পাচ্ছি তার থেকে অনুমতিগুলি পরিবর্তনের জন্য কোনও হুক / ফিল্টার নেই।
আমার বর্তমান সমাধানটি নিম্নলিখিত। এটি এমন কোনও শ্রেণীর সাথে আপোষ করে যেখানে আপনি অনুমতিপ্রাপ্ত ক্রিয়াকলাপের বিরুদ্ধে কাস্টম পোস্ট টাইপের ম্যাট্রিক্সে লোড করতে পারেন। এর পরে rest_prepare_vocabulary
ফিল্টারটিতে কল করা যেতে পারে, অনুমতিগুলি লাইন না করা হলে প্রতিক্রিয়াটিকে ধ্বংস করে।
সমস্যা
আমি মনে করি না যে এটি একটি যুক্তিসঙ্গত সমাধান। এর অর্থ হ'ল অনুমতিগুলি দুটি স্পটে সমাধান করা হচ্ছে (একটি, মূলত, এখনও সেগুলি প্রয়োগ করা হয়) এবং আমার ফিল্টারগুলিতে।
আদর্শভাবে, এটি একটি কনফিগারেশন স্তরে থাকবে, যেমন কাস্টম পোস্টের ধরণগুলি সংজ্ঞায়িত করা হয়।
অন্য কথায়, আমি পাস নিয়ম (এর লাইন বরাবর পছন্দ করেন exclude_from_search
, publicly_queryable
বরং একটি পোস্ট কোয়েরি করণ চেয়ে "স্নিপ", ইত্যাদি)।
বর্তমান সমাধান (কাজ কিন্তু পছন্দসই নয়)
Access.php
class Access
{
function __construct($permissions) {
$this->permissions = $permissions;
}
protected function hasId($request) {
return ! is_null($request->get_param('id'));
}
protected function resolveType($request) {
$method = strtoupper($request->get_method());
if($method === 'GET' && $this->hasId($request)) {
return 'show';
} else if($method === 'GET') {
return 'index';
} else if($method === 'DELETE') {
return 'delete';
} else if($method === 'POST') {
return 'create';
} else if($method === 'PATCH') {
return 'update';
}
}
function validate($type, $request) {
return in_array($this->resolveType($request), $this->permissions[$type]);
}
}
থিমের functions.php
// bootstrap the permissions for this particular
// application
//
$access = new Access([
'vocabulary' => ['show'],
]);
add_filter('rest_prepare_vocabulary', 'validate_permissions', 30, 3);
function validate_permissions($response, $post, $request) {
global $access;
// Give access->validate the type + request data
// and it will figure out if this is allowed
//
if( ! $access->validate($post->post_type, $request)) {
$response->set_data([]);
$response->set_status(403);
}
return $response;
};
\App
এবং অ্যাক্সেসটি আসলে\App\Services\Access
Access
বিশ্বব্যাপী সুযোগে তাত্ক্ষণিকভাবে কাজ করলেন ? আপনার অন্য কোথাও এটি দরকার? যদি আপনি হ্যাঁ এর উত্তর দিয়ে থাকেন তবে আপনি এটির পরিবর্তে কোনও ফিল্টারে সংযুক্ত করতে চাইতে পারেন।