Skip to content

Commit c45bccc

Browse files
committed
Added a doctrine orm query function for phone number
1 parent b2baeae commit c45bccc

File tree

1 file changed

+120
-0
lines changed

1 file changed

+120
-0
lines changed
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
<?php
2+
3+
namespace Misd\PhoneNumberBundle\Doctrine\ORM\DQL\Functions;
4+
5+
use Doctrine\ORM\Query\Lexer;
6+
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
7+
use Doctrine\ORM\Query\Parser;
8+
use Doctrine\ORM\Query\SqlWalker;
9+
use libphonenumber\PhoneNumber;
10+
use libphonenumber\PhoneNumberFormat;
11+
use libphonenumber\PhoneNumberUtil;
12+
13+
/**
14+
* Class Phone
15+
* @package Misd\PhoneNumberBundle\Doctrine\ORM\DQL\Functions
16+
*/
17+
class Phone extends FunctionNode
18+
{
19+
/**
20+
* @var PhoneNumber
21+
*/
22+
public $phoneNumber;
23+
24+
/**
25+
* @param \Doctrine\ORM\Query\SqlWalker $sqlWalker
26+
* @return string
27+
*/
28+
public function getSql(SqlWalker $sqlWalker)
29+
{
30+
$phoneUtil = PhoneNumberUtil::getInstance();
31+
32+
return "'{$phoneUtil->format($this->phoneNumber, PhoneNumberFormat::E164)}'";
33+
}
34+
35+
/**
36+
* @param \Doctrine\ORM\Query\Parser $parser
37+
*/
38+
public function parse(Parser $parser)
39+
{
40+
$phoneNumber = new PhoneNumber();
41+
$lexer = $parser->getLexer();
42+
$parser->match(Lexer::T_IDENTIFIER);
43+
$parser->match(Lexer::T_OPEN_PARENTHESIS);
44+
$parser->match(Lexer::T_IDENTIFIER);
45+
$parser->match(Lexer::T_IDENTIFIER);
46+
$parser->match(Lexer::T_INPUT_PARAMETER);
47+
$phoneNumber->setCountryCode($lexer->lookahead['value']);
48+
$parser->match(Lexer::T_IDENTIFIER);
49+
$parser->match(Lexer::T_IDENTIFIER);
50+
$parser->match(Lexer::T_IDENTIFIER);
51+
$parser->match(Lexer::T_INPUT_PARAMETER);
52+
$phoneNumber->setNationalNumber($lexer->lookahead['value']);
53+
$parser->match(Lexer::T_IDENTIFIER);
54+
55+
if (
56+
$lexer->lookahead['type'] == Lexer::T_LEADING &&
57+
$lexer->lookahead['value'] == 'Leading'
58+
) {
59+
$phoneNumber->setItalianLeadingZero(true);
60+
$parser->match(Lexer::T_IDENTIFIER);
61+
$parser->match(Lexer::T_IDENTIFIER);
62+
$parser->match(Lexer::T_OPEN_PARENTHESIS);
63+
$parser->match(Lexer::T_IDENTIFIER);
64+
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
65+
$parser->match(Lexer::T_INPUT_PARAMETER);
66+
$parser->match(Lexer::T_TRUE);
67+
}
68+
69+
if (
70+
$lexer->lookahead['type'] == Lexer::T_IDENTIFIER &&
71+
$lexer->lookahead['value'] == 'Number'
72+
) {
73+
$parser->match(Lexer::T_IDENTIFIER);
74+
$parser->match(Lexer::T_OF);
75+
$parser->match(Lexer::T_LEADING);
76+
$parser->match(Lexer::T_IDENTIFIER);
77+
$parser->match(Lexer::T_INPUT_PARAMETER);
78+
$phoneNumber->setNumberOfLeadingZeros($lexer->lookahead['value']);
79+
$parser->match(Lexer::T_INTEGER);
80+
}
81+
82+
if (
83+
$lexer->lookahead['type'] == Lexer::T_IDENTIFIER &&
84+
$lexer->lookahead['value'] == 'Extension'
85+
) {
86+
$parser->match(Lexer::T_IDENTIFIER);
87+
$parser->match(Lexer::T_INPUT_PARAMETER);
88+
$phoneNumber->setExtension($lexer->lookahead['value']);
89+
$parser->match(Lexer::T_INTEGER);
90+
}
91+
92+
if (
93+
$lexer->lookahead['type'] == Lexer::T_IDENTIFIER &&
94+
$lexer->lookahead['value'] == 'Country'
95+
) {
96+
$parser->match(Lexer::T_IDENTIFIER);
97+
$parser->match(Lexer::T_IDENTIFIER);
98+
$parser->match(Lexer::T_IDENTIFIER);
99+
$parser->match(Lexer::T_INPUT_PARAMETER);
100+
$phoneNumber->setCountryCodeSource($lexer->lookahead['value']);
101+
$parser->match(Lexer::T_INTEGER);
102+
}
103+
104+
if (
105+
$lexer->lookahead['type'] == Lexer::T_IDENTIFIER &&
106+
$lexer->lookahead['value'] == 'Preferred'
107+
) {
108+
$parser->match(Lexer::T_IDENTIFIER);
109+
$parser->match(Lexer::T_IDENTIFIER);
110+
$parser->match(Lexer::T_IDENTIFIER);
111+
$parser->match(Lexer::T_IDENTIFIER);
112+
$parser->match(Lexer::T_INPUT_PARAMETER);
113+
$phoneNumber->setPreferredDomesticCarrierCode($lexer->lookahead['value']);
114+
$parser->match(Lexer::T_STRING);
115+
}
116+
117+
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
118+
$this->phoneNumber = $phoneNumber;
119+
}
120+
}

0 commit comments

Comments
 (0)