বিশ্রাম ভি 2 (ডাব্লুপি 4.7) দিয়ে কেউ কীভাবে কিছু বিশিষ্ট ক্রিয়াগুলিকে সীমাবদ্ধ করে?


20

আমি প্রতি কাস্টম পোস্ট ধরণের নির্দিষ্ট কিছু 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;
};

1
আপনি কেন Accessবিশ্বব্যাপী সুযোগে তাত্ক্ষণিকভাবে কাজ করলেন ? আপনার অন্য কোথাও এটি দরকার? যদি আপনি হ্যাঁ এর উত্তর দিয়ে থাকেন তবে আপনি এটির পরিবর্তে কোনও ফিল্টারে সংযুক্ত করতে চাইতে পারেন।
কায়সার

3
সুষ্ঠু প্রশ্ন - উপরেরটি কেবল একটি স্নিপেট, আমি একটি প্যারেন্ট অ্যাপ্লিকেশন শ্রেণিতে ক্লাস মডিউলগুলি আঁকতে সুরকার এবং পিএসআর 4 ​​অটোলয়েড ব্যবহার করছি, যার মধ্যে উপরের স্নিপেটটি থাকবে - সুতরাং এটি আসলে বিশ্বব্যাপী নয়, এটি নামগতির হবে \Appএবং অ্যাক্সেসটি আসলে\App\Services\Access
ক্রিস

1
আমি নিজেই এই সমস্যাটি তদন্ত করে দেখিনি, তবে আপনি কি ট্র্যাকটি টিকিটের জন্য পরীক্ষা করেছেন বা এটি উপস্থিত না থাকলে একটি তৈরি করেছেন? যুক্তিসঙ্গত বৈশিষ্ট্যটির মতো মনে হচ্ছে ...
ক্র্যাফটনার

1
আমি আসলেই সমস্যাটি বুঝতে পারি না। "এর অর্থ হ'ল অনুমতিগুলি দুটি দাগে সমাধান করা হচ্ছে (একটি, মূলত, এখনও সেগুলি প্রয়োগ করা হয়) এবং আমার ফিল্টারগুলিতে I আপনি এখানে কী বোঝাতে চেয়েছেন তা স্পষ্ট করে বলতে পারেন? আমি বোকা যদি দুঃখিত!
জিম মাগুয়ের

2
আমি এই প্রশ্নটিকে নিম্নমানের করছি। আমি বুঝতে পারি না কেন 18 জন এটি আপত্তি করেছে। এটা বোধগম্য।
জিম মাগুয়ের

উত্তর:


1

আমি উত্সটি পেরিয়ে গিয়েছি এবং যা দেখতে পাচ্ছি তার থেকে অনুমতিগুলি পরিবর্তনের জন্য কোনও হুক / ফিল্টার নেই।

আমার বোধগম্যতা হ'ল এটি উদ্দেশ্যমূলক নকশার সিদ্ধান্ত ছিল।

আরআরএসপি এপিআইটি এক্সটেনসিবল হিসাবে নির্মিত হয়েছিল, আপনি যেভাবে জিজ্ঞাসা করছেন সেভাবে মূল সমাপ্তিগুলি পরিবর্তন করার পরামর্শ দেওয়া হয় না।

আরআরএসআইপি হ্যান্ডবুকের এই বিভাগে কিছু সীমাবদ্ধ তথ্য পাওয়া যায় , তবে এর সংক্ষিপ্তসারটি হ'ল এপিআই বয়স হিসাবে আরও কোড (এটি মূল বা তৃতীয় পক্ষই হোক) সুনির্দিষ্ট ক্রিয়াগুলি উপলব্ধ এবং মান সরবরাহের উপর নির্ভর করতে শুরু করবে প্রতিক্রিয়া নেই।

পরিবর্তে আপনার একটি কাস্টম নিয়ামক তৈরি করা উচিত।

rest_controller_classআর্গুমেন্টেregister_post_type() শ্রেণীর নাম উল্লেখ করে কাস্টম পোস্ট প্রকারগুলিকে একটি কাস্টম নিয়ামক দেওয়া যেতে পারে ।

কাস্টম নিয়ন্ত্রণকারীদের কীভাবে কাজ করা উচিত তার একটি সংক্ষিপ্তসার REST এপিআই হ্যান্ডবুকে পাওয়া যাবে ।

অন্য কিছু মনে রাখার বিষয় হ'ল আপনি যদি এমন একটি কাস্টম কন্ট্রোলার তৈরি করেন যা WP_REST_Controllerকোনও পোস্ট টাইপের সংশোধনগুলিকে সমর্থন করে এমন বিমূর্ত শ্রেণিকে প্রসারিত করে , তবে বেশ কয়েকটি পোস্ট টাইপের নির্দিষ্ট সংশোধন সমাপ্তিগুলি স্বয়ংক্রিয়ভাবে তৈরি হয়ে যাবে।

যদি এটি WP_REST_Controllerশ্রেণিটি প্রসারিত না করে তবে register_routes()পদ্ধতিটি বলা হয় না সুতরাং আপনাকে নিজের কাস্টম রুটগুলি ম্যানুয়ালি নিবন্ধন করতে হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.