Entity API-ն իրականացնում է Typed Data API-ն
Համարժեք բարելավում
- Entity API-ն այժմ իրականացնում է Typed Data API-ն։
Այս նոր իրականացման մեջ Entity API-ի ամեն ինչ ներկայացված է դաշտի տեսքով, որը հիմնված է նույն API-ի վրա, այդ պատճառով էլ էնտիթիները կանխատեսելի և համակողմանի են։
Drupal-ի տվյալների մոդելի հասկացում
Առաջինը, նախքան խորը ուսումնասիրենք Typed Data API-ն, պետք է հասկանանք, թե ինչպես է նախկինում ընկալվում Drupal-ի տվյալների մոդելը (Entity API)։ Սա կարևոր է, քանի որ հենց այստեղից է առաջացել Typed Data API-ն, իսկ Entity API-ն հանդիսանում է այն համակարգերից մեկը, որոնց համար այն մշակվել է։
Էնտիթին մեկ բարդ տվյալների մասը է, որը բաղկացած է այլ տվյալների մասերից, ինչպիսիք են դաշտերը՝ էլեմենտների ցանկով։ Դաշտի էլեմենտն էլ բարդ է՝ բաղկացած է ավելի փոքր տվյալների կտորներից, օրինակ՝ տեքստային արժեք և մուտքի ֆորմատ։ Սակայն բարդությունը հասնում է այնպիսի մակարդակի, որ ինչ-որ բան կարելի է նկարագրել որպես պարզ տիպի տվյալ, օրինակ՝ տող կամ ամբողջ թիվ։
Պարզեցված օրինակ Drupal 7-ից (լեզվի կոդ չկա, քանի որ Drupal 8-ը դա այլ կերպ է անում)
Օրինակ 1
// Էնտիթիները բարդ են, պարունակում են այլ տվյալների կտորներ։ $entity; // Դաշտերը բարդ չեն, դրանք պարունակում են միայն էլեմենտների ցանկ։ $entity->image; // Էլեմենտները բարդ են, պարունակում են այլ տվյալների կտորներ, թարգմանելի են և հասանելի (ունեն թույլտվություններ)։ $entity->image[0]; // Ֆայլի ID-ն պարզ ամբողջ թիվ է։ $entity->image[0]['fid']; // Alternative տեքստը պարզ տող է։ $entity->image[0]['alt'];
Ամբողջացնում ենք միասին
Ստորև ներկայացված է պարզեցված օրինակ, թե ինչպես է Entity API-ն իրականացնում ինտերֆեյսները, բացի Typed Data API-ից։ Իրականում Entity API-ն ընդլայնում է այդ ինտերֆեյսները՝ ավելացնելով լրացուցիչ մեթոդներ, որոնք անհրաժեշտ են Entity API-ին։ Այնուամենայնիվ, ստորև նշված բոլոր հայտարարությունները ճշմարիտ են․
Օրինակ 2
// Էնտիթիները բարդ են։ $entity instanceof ComplexDataInterface; // Հատկությունները բարդ չեն, դրանք միայն էլեմենտների ցանկ են։ $entity->get('image') instanceof ListInterface; // Էլեմենտները բարդ են։ $entity->get('image')->offsetGet(0) instanceof ComplexDataInterface; // Typed Data օբյեկտը, որը ներկայացնում է alt արժեքը։ $entity->get('image')->offsetGet(0)->get('alt') instanceof TypedDataInterface; // alt արժեքը պարզ տող է։ is_string($entity->get('image')->offsetGet(0)->get('alt')->getValue());
Ստորև ամփոփվում է, թե ինչպես է Entity API-ն ընդլայնում Typed Data API-ն՝ որոշ լրացուցիչ պահանջների համար․
Օրինակ 3
interface EntityInterface extends ComplexDataInterface, TranslatableInterface, AccessibleInterface { // ... } interface FielditemListInterface extends ListInterface { // ... } // Ուշադրություն դարձրեք, որ սա ընդլայնում է երկու ինտերֆեյս։ Ներքևում բացատրություն կա։ interface FieldItemInterface extends ComplexDataInterface, TypedDataInterface { // ... } // Ստորև ներկայացված են իրական իրականացումներ։ // Ստացած է մի абստրակտ դաս, որն ունի ընդհանուր լոգիկա։ class ImageItem extends FieldItemBase { // ... } // Ստացած է մի абստրակտ դաս, որն ունի ընդհանուր լոգիկա։ class String extends TypedData { // ... }
[Հաջորդ երկու պարբերակները պահանջում են լրացուցիչ աշխատանք]
Երկու ամենանշանակալիները վերևում՝
1. EntityInterface-ն ընդլայնում է որոշ ծառայողական ինտերֆեյսներ, ինչպիսիք են թարգմանությունն ու մուտքի թույլտվությունները։ Դա պետք է բավականին պարզ լինի։
2. FieldItemInterface-ը ընդլայնում է ինչպես ComplexDataInterface-ը, այնպես էլ TypedDataInterface-ը։ Ինչպես նշվել է, էլեմենտները բարդ են, քանի որ պարունակում են ավելի փոքր տվյալների կտորներ (օրինակ՝ տեքստային արժեք և ձևաչափ)։ Բայց միևնույն ժամանակ էլեմենտը ինքնին նաև Typed Data-ի մաս է, ուստի ունի իր սեփական սահմանումը և տիպը։
Այսպիսով, ամփոփելով՝ ի լրումն Օրինակ 2-ի, ստորև նշված բոլոր հայտարարությունները նույնպես ճշմարիտ են․
Օրինակ 4
$entity instanceof EntityInterface; $entity->get('image') instanceof FieldItemListInterface; $entity->get('image')->offsetGet(0) instanceof FieldItemInterface; $entity->get('image')->offsetGet(0)->get('alt') instanceof String; is_string($entity->get('image')->offsetGet(0)->get('alt')->getValue());
API-ի օգտագործում
[Այս բաժնում պետք են լրացուցիչ օրինակներ]
Entity API-ն սահմանում է որոշ կախարդական մեթոդներ, ինչպիսիք են __get(), որպեսզի ապահովի դաշտի արժեքներին արագ և հեշտ մուտք։ Այսպիսով, API-ի օգտագործումը շատ պարզ է, և շարադրանքը նման է Drupal 8-ից առաջվա ժամանակներին։
Ներքևում ներկայացված է՝ ինչպես կարելի է ստանալ պատկերին առընթեր alternative տեքստի իրական արժեքը՝
Օրինակ 5
// Ամենաամբողջական ձևը։ $string = $entity->get('image')->offsetGet(0)->get('alt')->getValue(); // Entity API-ի հավելված կախարդանքով։ $string = $entity->image[0]->alt; // Entity API-ի ավելի շատ կախարդանքով, որը վերցնում է առաջին էլեմենտը // լռելյայն ցուցակից։ $string = $entity->image->alt;
Վերևի օրինակն ավելացնում է միայն հարմար շարադրանք հին API-ին։ Ստորև ներկայացված օրինակները ցույց են տալիս, թե որտեղ է այս API-ի իրական արժեքը՝ տվյալների ստուգումն է․
Օրինակ 6
// Վերադարձնում է դաշտերի անուններով զանգված բոլոր դաշտերի և նրանց սահմանումների համար։ Օրինակ՝ ‘image’ դաշտը։ $property_definitions = $entity->getFieldDefinitions(); // Վերադարձնում է հատկությունների անուններով զանգված, օրինակ՝ ‘file_id’ և ‘alt’ հատկությունների համար։ $property_definitions = $entity->image ->getFieldDefinition() ->getFieldStorageDefinition() ->getPropertyDefinitions(); // Վերադարձնում է միայն ‘alt’ property's սահմանումը։ $string_definition = $entity->image ->getFieldDefinition() ->getFieldStorageDefinition() ->getPropertyDefinition('alt');
Վերոնշյալ սահմանումների հիման վրա այժմ կարող ենք կատարել խելացի գործողություններ, ինչպիսիք են սերիալիզացիան կամ տվյալների այլ զանգվածի պատրաստումը։ Մենք նաև կարող ենք տրամադրել այդ տվյալները սեմանտիկորեն հարուստ API-ներով, ինչպես JSON-LD endpoint-ը, որպեսզի այլ համակարգերը հասկանան մեր տվյալների հիմքերը։
Տեսեք Https://drupal.org/node/2078241 լրացուցիչ տեղեկությունների և օրինակների համար՝ թե ինչպես սահմանել և օգտագործել էնտիթի դաշտերի սահմանումները։
Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.