استخدم ramsey/uuid كنوع حقل العقيدة
توفر حزمة ramsey/uuid-doctrine القدرة على استخدام ramsey/uuid كنوع حقل Doctrine.
يلتزم هذا المشروع بمدونة قواعد السلوك. من خلال المشاركة في هذا المشروع ومجتمعه، يتوقع منك التمسك بهذا الرمز.
قم بتثبيت هذه الحزمة باعتبارها تبعية باستخدام Composer.
composer require ramsey/uuid-doctrine
لتكوين Doctrine لاستخدام ramsey/uuid كنوع حقل، ستحتاج إلى إعداد ما يلي في bootstrap الخاص بك:
Doctrine DBAL Types Type:: addType ( ' uuid ' , ' RamseyUuidDoctrineUuidType ' );
في سيمفوني:
# config/packages/doctrine.yaml
doctrine :
dbal :
types :
uuid : RamseyUuidDoctrineUuidType
في إطار زند:
<?php
// module . config . php
use Ramsey Uuid Doctrine UuidType ;
return [
' doctrine ' => [
' configuration ' => [
' orm_default ' => [
' types ' => [
UuidType:: NAME => UuidType::class,
في لارافيل:
<?php
// config / doctrine . php
' custom_types ' => [
Ramsey Uuid Doctrine UuidType:: NAME => Ramsey Uuid Doctrine UuidType::class
],
في عقيدة حاوية roave/psr:
<?php
use Ramsey Uuid Doctrine UuidType ;
return [
' doctrine ' => [
' types ' => [
UuidType:: NAME => UuidType::class,
],
/* ... */
],
/* ... */
];
بعد ذلك، في نماذجك، يمكنك إضافة تعليقات توضيحية إلى الخصائص عن طريق تعيين النوع #[Column]
إلى uuid
، وتحديد مولد مخصص لـ RamseyUuidUuidGenerator
. العقيدة سوف تتعامل مع الباقي.
use Doctrine ORM Mapping as ORM ;
use Ramsey Uuid Doctrine UuidGenerator ;
use Ramsey Uuid UuidInterface ;
#[ ORM Entity]
#[ ORM Table(name: " products " )]
class Product
{
#[ ORM Id]
#[ ORM Column(type: " uuid " , unique: true )]
#[ ORM GeneratedValue(strategy: " CUSTOM " )]
#[ ORM CustomIdGenerator(class: UuidGenerator::class)]
protected UuidInterface $ id ;
public function getId (): UuidInterface
{
return $ this -> id ;
}
}
إذا كنت تستخدم تعيين XML بدلاً من سمات PHP.
< id name = " id " column = " id " type = " uuid " >
< generator strategy = " CUSTOM " />
< custom-id-generator class = " RamseyUuidDoctrineUuidGenerator " />
</ id >
يمكنك أيضًا استخدام مخطط YAML.
id :
id :
type : uuid
generator :
strategy : CUSTOM
customIdGenerator :
class : RamseyUuidDoctrineUuidGenerator
في المثال السابق، سيقوم Doctrine بإنشاء عمود قاعدة بيانات من النوع CHAR(36)
إذا كان MariaDB / MySQL قيد الاستخدام، ولكن يمكنك أيضًا استخدام هذه المكتبة لتخزين UUIDs كسلاسل ثنائية. يساعد UuidBinaryType
على تحقيق ذلك.
في Bootstrap الخاص بك، ضع ما يلي:
Doctrine DBAL Types Type:: addType ( ' uuid_binary ' , ' RamseyUuidDoctrineUuidBinaryType ' );
$ entityManager -> getConnection ()-> getDatabasePlatform ()-> registerDoctrineTypeMapping ( ' uuid_binary ' , ' binary ' );
في سيمفوني:
# config/packages/doctrine.yaml
doctrine :
dbal :
types :
uuid_binary : RamseyUuidDoctrineUuidBinaryType
# Uncomment if using doctrine/orm <2.8
# mapping_types:
# uuid_binary: binary
بعد ذلك، عند إضافة تعليقات توضيحية لخصائص فئة النموذج، استخدم uuid_binary
بدلاً من uuid
:
#[Column(type: "uuid_binary")]
أكثر ملاءمة إذا كنت تريد استخدام UUIDs كمفتاح أساسي. لاحظ أن هذا يمكن أن يسبب تأثيرات غير مقصودة إذا:
مزيد من المعلومات في مقالة Percona هذه وUUID Talk بقلم Ben Ramsey (يبدأ من الشريحة 58).
Doctrine DBAL Types Type:: addType ( ' uuid_binary_ordered_time ' , ' RamseyUuidDoctrineUuidBinaryOrderedTimeType ' );
$ entityManager -> getConnection ()-> getDatabasePlatform ()-> registerDoctrineTypeMapping ( ' uuid_binary_ordered_time ' , ' binary ' );
في سيمفوني:
# config/packages/doctrine.yaml
doctrine :
dbal :
types :
uuid_binary_ordered_time : RamseyUuidDoctrineUuidBinaryOrderedTimeType
# Uncomment if using doctrine/orm <2.8
# mapping_types:
# uuid_binary_ordered_time: binary
بعد ذلك، في نماذجك، يمكنك إضافة تعليقات توضيحية إلى الخصائص عن طريق تعيين نوع @Column
على uuid_binary_ordered_time
وتحديد مولد مخصص لـ RamseyUuidUuidOrderedTimeGenerator
. العقيدة سوف تتعامل مع الباقي.
#[Entity]
#[Table(name: " products " )]´
class Product
{
#[Id]
#[Column(type: " uuid_binary_ordered_time " , unique: true )]
#[GeneratedValue(strategy: " CUSTOM " )]
#[CustomIdGenerator(class: UuidOrderedTimeGenerator::class)]
protected UuidInterface $ id ;
public function getId (): UuidInterface
{
return $ this -> id ;
}
}
إذا كنت تستخدم تعيين XML بدلاً من التعليقات التوضيحية PHP.
< id name = " id " column = " id " type = " uuid_binary_ordered_time " >
< generator strategy = " CUSTOM " />
< custom-id-generator class = " RamseyUuidDoctrineUuidOrderedTimeGenerator " />
</ id >
مع تقديم أنواع UUID الجديدة (بما في ذلك الإصدار 7 من UUID القابل للفرز والمستند إلى عصر Unix)، يوصى الآن باستخدام uuid_binary
العادي مع RamseyUuidDoctrineUuidV7Generator
للمفاتيح الأساسية.
في Bootstrap الخاص بك، ضع ما يلي:
Doctrine DBAL Types Type:: addType ( ' uuid_binary ' , ' RamseyUuidDoctrineUuidBinaryType ' );
$ entityManager -> getConnection ()-> getDatabasePlatform ()-> registerDoctrineTypeMapping ( ' uuid_binary ' , ' binary ' );
في سيمفوني:
# config/packages/doctrine.yaml
doctrine :
dbal :
types :
uuid_binary : RamseyUuidDoctrineUuidBinaryType
# Uncomment if using doctrine/orm <2.8
# mapping_types:
# uuid_binary: binary
بعد ذلك، في نماذجك، يمكنك إضافة تعليقات توضيحية إلى الخصائص عن طريق تعيين النوع #[Column]
إلى uuid_binary
، وتحديد مولد مخصص لـ RamseyUuidUuidV7Generator
. العقيدة سوف تتعامل مع الباقي.
#[Entity]
#[Table(name: " products " )]
class Product
{
#[Id]
#[Column(type: " uuid_binary " , unique: true )]
#[GeneratedValue(strategy: " CUSTOM " )]
#[CustomIdGenerator(class: UuidV7Generator::class)]
protected UuidInterface $ id ;
public function getId (): UuidInterface
{
return $ this -> id ;
}
}
إذا كنت تستخدم تعيين XML بدلاً من التعليقات التوضيحية PHP.
< id name = " id " column = " id " type = " uuid_binary " >
< generator strategy = " CUSTOM " />
< custom-id-generator class = " RamseyUuidDoctrineUuidV7Generator " />
</ id >
إذا كنت تستخدم PostgreSQL، فإن Doctrine يستخدم uuid
الخاص بـ PostgreSQL لـ RamseyUuidDoctrineUuidType
( uuid
). لذلك لا تحتاج إلى استخدام أنواع uuid_binary
/ uuid_binary_ordered_time
عند استخدام PostgreSQL. لا يزال بإمكانك استخدام UuidV7Generator::class
لتحسين الفهرسة بالرغم من ذلك.
#[Entity]
#[Table(name: " products " )]
class Product
{
#[Id]
#[Column(type: " uuid " , unique: true )]
#[GeneratedValue(strategy: " CUSTOM " )]
#[CustomIdGenerator(class: UuidV7Generator::class)]
protected UuidInterface $ id ;
public function getId (): UuidInterface
{
return $ this -> id ;
}
}
عند العمل باستخدام المعرفات الثنائية، قد ترغب في تحويلها إلى تنسيق قابل للقراءة. اعتبارًا من MySql 8.0، يمكنك استخدام وظائف BIN_TO_UUID وUUID_TO_BIN الموثقة هنا. تحدد الوسيطة الثانية ما إذا كان يجب تبديل ترتيب البايت، وبالتالي عند استخدام uuid_binary
يجب تمرير 0 وعند استخدام uuid_binary_ordered_time
يجب تمرير 1.
بالنسبة للإصدارات الأخرى يمكنك استخدام ما يلي:
DELIMITER $$
CREATE
FUNCTION BIN_TO_UUID(bin_uuid BINARY( 16 ), swap_flag BOOLEAN )
RETURNS CHAR ( 36 )
DETERMINISTIC
BEGIN
DECLARE hex_uuid CHAR ( 32 );
SET hex_uuid = HEX(bin_uuid);
RETURN LOWER (CONCAT(
IF(swap_flag, SUBSTR(hex_uuid, 9 , 8 ),SUBSTR(hex_uuid, 1 , 8 )), ' - ' ,
IF(swap_flag, SUBSTR(hex_uuid, 5 , 4 ),SUBSTR(hex_uuid, 9 , 4 )), ' - ' ,
IF(swap_flag, SUBSTR(hex_uuid, 1 , 4 ),SUBSTR(hex_uuid, 13 , 4 )), ' - ' ,
SUBSTR(hex_uuid, 17 , 4 ), ' - ' ,
SUBSTR(hex_uuid, 21 )
));
END$$
CREATE
FUNCTION UUID_TO_BIN(str_uuid CHAR ( 36 ), swap_flag BOOLEAN )
RETURNS BINARY( 16 )
DETERMINISTIC
BEGIN
RETURN UNHEX(CONCAT(
IF(swap_flag, SUBSTR(str_uuid, 15 , 4 ),SUBSTR(str_uuid, 1 , 8 )),
SUBSTR(str_uuid, 10 , 4 ),
IF(swap_flag, SUBSTR(str_uuid, 1 , 8 ),SUBSTR(str_uuid, 15 , 4 )),
SUBSTR(str_uuid, 20 , 4 ),
SUBSTR(str_uuid, 25 ))
);
END$$
DELIMITER ;
الاختبارات:
mysql> select '07a2f327-103a-11e9-8025-00ff5d11a779' as uuid, BIN_TO_UUID(UUID_TO_BIN('07a2f327-103a-11e9-8025-00ff5d11a779', 0), 0) as flip_flop;
+--------------------------------------+--------------------------------------+
| uuid | flip_flop |
+--------------------------------------+--------------------------------------+
| 07a2f327-103a-11e9-8025-00ff5d11a779 | 07a2f327-103a-11e9-8025-00ff5d11a779 |
+--------------------------------------+--------------------------------------+
1 row in set (0.00 sec)
mysql> select '07a2f327-103a-11e9-8025-00ff5d11a779' as uuid, BIN_TO_UUID(UUID_TO_BIN('07a2f327-103a-11e9-8025-00ff5d11a779', 1), 1) as flip_flop;
+--------------------------------------+--------------------------------------+
| uuid | flip_flop |
+--------------------------------------+--------------------------------------+
| 07a2f327-103a-11e9-8025-00ff5d11a779 | 07a2f327-103a-11e9-8025-00ff5d11a779 |
+--------------------------------------+--------------------------------------+
1 row in set (0.00 sec)
لمزيد من المعلومات حول البدء باستخدام Doctrine، راجع البرنامج التعليمي "البدء باستخدام Doctrine".
المساهمات هي موضع ترحيب! للمساهمة، يرجى التعرف على CONTRIBUTING.md.
يعد الحفاظ على سلامة وأمان معلومات المستخدم أولوية قصوى، ونحن نرحب بمساهمة الباحثين الأمنيين الخارجيين. إذا كنت تعتقد أنك وجدت مشكلة أمنية في البرنامج الذي تم الاحتفاظ به في هذا المستودع، فيرجى قراءة SECURITY.md للحصول على إرشادات حول إرسال تقرير الثغرات الأمنية.
متاح كجزء من اشتراك Tidelift.
يعمل القائمون على صيانة ramsey/uuid-doctrine وآلاف الحزم الأخرى مع Tidelift لتقديم الدعم التجاري والصيانة للحزم مفتوحة المصدر التي تستخدمها لبناء تطبيقاتك. يمكنك توفير الوقت وتقليل المخاطر وتحسين سلامة التعليمات البرمجية، مع الدفع لمشرفي الحزم المحددة التي تستخدمها. يتعلم أكثر.
مكتبة ramsey/uuid-doctrine محمية بحقوق الطبع والنشر © Ben Ramsey ومرخصة للاستخدام بموجب ترخيص MIT (MIT). يرجى الاطلاع على الترخيص لمزيد من المعلومات.