Криптографическая хеш-функция — это хеш-функция, которая принимает входные данные (или «сообщение») и возвращает буквенно-цифровую строку фиксированного размера, которая называется хеш-значением (иногда ее называют дайджестом сообщения, цифровым отпечатком, дайджестом или контрольной суммой). , Наиболее известными из них являются такие функции, как MD5, SHA1 и SHA2.
Эти функции изначально доступны в среде MySQL, однако недоступны в доктрине, и вы получите ошибки, если попытаетесь получить к ним доступ в своих запросах. Чтобы добавить доступность к этим функциям в доктрине, мы собираемся добавить 3 расширения доктрины (по 1 для каждой функции), затем мы зарегистрируем их в файле config.yml и, наконец, покажем несколько примеров использования.
Замечания: Этот учебник работает как для Symfony 2.x, так и для Symfony 3.x.
Реализация
Чтобы начать, найдите себя в корневой папке вашего пакета и создайте папку с именем расширения (или корневой каталог /srcв случае, если его не существует. Затем создайте папку внутри с именем Doctrine, она будет содержать все классы расширения для Doctrine.
И, пожалуйста, не забудьте изменить пространство имен каждого класса в соответствии с расположением внутри вашего проекта.
MD5
Создать внутри ранее созданного учение папка новый класс с именем Md5.php и сохраните следующий код внутри.
getConnection()->getDatabasePlatform()->getMd5Expression(
$sqlWalker->walkStringPrimary($this->stringPrimary)
);
}
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->stringPrimary = $parser->StringPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
}
Предыдущий класс позволит вам использовать функцию MD5 внутри запроса доктрины и предотвратить известную ошибку:
[Ошибка синтаксиса] Ошибка: ожидаемая известная функция, получил «MD5»
Сейчас класс существует в нашем проекте, но он не зарегистрирован. Чтобы использовать его, нам нужно зарегистрировать функцию в config.yml файл нашего проекта, просто перейдите в область доктрины и сохраните MD5 свойство с путем к классу в свойстве dql ORM.
# app/config/config.yml
# Doctrine Configuration
doctrine:
# Search for the ORM property
orm:
# Those values should be already in your file and this doesn't matter
auto_generate_proxy_classes: "%kernel.debug%"
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
# We need this the dql property to register the custom doctrine functions :
dql:
string_functions:
# Match agains should have the path to the Md5 class created in the previous step
MD5: myBundle\Extensions\Doctrine\Md5
И ты готов к работе! очистить кеш в случае, если вы работаете в среде Prod и давайте создадим несколько запросов.
MD5 Использование
Функция MD5 доступна для использования, вы можете использовать ее в течение построитель запросов или простой DQL.
Учитывая следующую таблицу Породы (с Породами сущностей), найдите породу с хешем MD5 «1».
| 1 | Аляскинский маламут | c4ca4238a0b923820dcc509a6f75849b |
Тогда мы могли бы просто использовать построитель запросов (помните, MD5 хеш 1 является c4ca4238a0b923820dcc509a6f75849b):
getDoctrine()->getManager();
$repository = $em->getRepository("sandboxBundle:Breeds");
$reg = $repo->createQueryBuilder('a')
->where("a.hash = MD5(:id)")
->setParameter('id', 1 )
->getQuery()
->getResult();
dump($reg);
}
}
$reg переменная должна возвращать строку аляскинского маламута.
SHA1
Создать внутри ранее созданного учение папка новый класс с именем Sha1.php и сохраните следующий код внутри.
walkStringPrimary($this->stringPrimary) .
')';
}
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->stringPrimary = $parser->StringPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
}
Предыдущий класс позволит вам использовать функцию SHA1 внутри запроса доктрины и предотвратить известную ошибку:
[Ошибка синтаксиса] Ошибка: ожидаемая известная функция, получил ‘SHA1’
Сейчас класс существует в нашем проекте, но он не зарегистрирован. Чтобы использовать его, нам нужно зарегистрировать функцию в config.yml файл нашего проекта, просто перейдите в область доктрины и сохраните SHA1 свойство с путем к классу в свойстве dql ORM.
# app/config/config.yml
# Doctrine Configuration
doctrine:
# Search for the ORM property
orm:
# Those values should be already in your file and this doesn't matter
auto_generate_proxy_classes: "%kernel.debug%"
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
# We need this the dql property to register the custom doctrine functions :
dql:
string_functions:
# Match agains should have the path to the Sha1 class created in the previous step
SHA1: myBundle\Extensions\Doctrine\Sha1
И ты готов к работе! очистите кеш на случай, если вы работаете в среде prod, и давайте создадим несколько запросов.
Использование SHA1
Функция SHA1 доступна для использования, вы можете использовать ее в построитель запросов или простой DQL.
Учитывая следующую таблицу Породы (с Породами сущностей), найдите породу с хешем SHA1, равным «1».
| 1 | Аляскинский маламут | 356a192b7913b04c54574d18c28d46e6395428ab |
Тогда мы могли бы просто использовать построитель запросов (помните, хеш SHA1 1 является 356a192b7913b04c54574d18c28d46e6395428ab):
getDoctrine()->getManager();
$repository = $em->getRepository("sandboxBundle:Breeds");
$reg = $repo->createQueryBuilder('a')
->where("a.hash = SHA1(:id)")
->setParameter('id', 1 )
->getQuery()
->getResult();
dump($reg);
}
}
$reg переменная должна возвращать строку аляскинского маламута.
SHA2
Создать внутри ранее созданного учение папка новый класс с именем Sha2.php и сохраните следующий код внутри.
walkStringPrimary($this->stringPrimary) .
',' .
$sqlWalker->walkSimpleArithmeticExpression($this->simpleArithmeticExpression) .
')';
}
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->stringPrimary = $parser->StringPrimary();
$parser->match(Lexer::T_COMMA);
$this->simpleArithmeticExpression = $parser->SimpleArithmeticExpression();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
}
Предыдущий класс позволит вам использовать функцию SHA2 внутри запроса доктрины и предотвратить известную ошибку:
[Ошибка синтаксиса] Ошибка: ожидаемая известная функция, получил ‘SHA2’
Сейчас класс существует в нашем проекте, но он не зарегистрирован. Чтобы использовать его, нам нужно зарегистрировать функцию в config.yml файл нашего проекта, просто перейдите в область доктрины и сохраните SHA2 свойство с путем к классу в свойстве dql ORM.
# app/config/config.yml
# Doctrine Configuration
doctrine:
# Search for the ORM property
orm:
# Those values should be already in your file and this doesn't matter
auto_generate_proxy_classes: "%kernel.debug%"
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
# We need this the dql property to register the custom doctrine functions :
dql:
string_functions:
# Match agains should have the path to the Sha2 class created in the previous step
SHA2: myBundle\Extensions\Doctrine\Sha2
И ты готов к работе! очистите кеш на случай, если вы работаете в среде prod, и давайте создадим несколько запросов.
Использование SHA2
Функция SHA2 доступна для использования, вы можете использовать ее в построитель запросов или простой DQL. Помните, что функция SHA2 вычисляет семейство хеш-функций SHA-2 (SHA-224, SHA-256, SHA-384 и SHA-512). первый аргумент строка открытого текста, которую нужно хэшировать второй аргумент указывает желаемую длину в битах результата, которая должна иметь значение 224, 256, 384, 512 или 0 (что эквивалентно 256). Если один из аргументов равен NULL или длина хеша не является одним из допустимых значений, возвращаемое значение равно NULL. В противном случае результатом функции является хеш-значение, содержащее желаемое количество битов.
Если мы не предоставим второй параметр в инструкции доктрины, мы получим следующее сообщение об ошибке:
[Ошибка синтаксиса] Ошибка: ожидаемый Doctrine \ ORM \ Query \ Lexer :: T_COMMA, получил ‘)’
Учитывая следующую таблицу Пород (с Породами сущностей), найдите породу с хешем SHA2 «1».
| 1 | Аляскинский маламут | 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b |
Тогда мы могли бы просто использовать построитель запросов (помните, SHA2 в 256 хэш из 1 является 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b):
getDoctrine()->getManager();
$repository = $em->getRepository("sandboxBundle:Breeds");
$reg = $repo->createQueryBuilder('a')
// Read about SHA2 MYSQL : https://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html#function_sha2
// The hash is stored with SHA2-256, therefore the second parameter of SHA2 is 256
->where("a.hash = SHA2(:id,256)")
->setParameter('id', 1 )
->getQuery()
->getResult();
dump($reg);
}
}
$reg переменная должна возвращать строку аляскинского маламута.
Отказ от ответственности: расширение доктрины было получено из Хранилище Doctrine Extensions от Беберлей в Гитхубе
Повеселись !