Piszemy nową klasę – DirectiveParser. Przyda się do parsowania dyrektyw w TemplateEngine, które również do naszego projektu MVC napiszemy!
Przypomnijmy sobie klasę Spoofer jakiś czas temu napisaną:
<?php
class Spoofer {
public static function isMethod($method){
if($method === 'GET' || $method === 'POST'){
return $method === $_SERVER['REQUEST_METHOD'];
}
elseif($_SERVER['REQUEST_METHOD'] !== 'POST'){
return false;
} elseif(!isset($_POST["_method"])) {
return false;
} else {
return $method === $_POST["_method"];
}
}
public static function method($method){
echo '<input type="hidden" id="_method" name="_method" value="' . $method . '"/>';
}
}
Chcemy odtworzyć zachowanie z templatkowego enginu Laravela (blade). Piszemy zatem:
class DirectiveParser {
protected static $patterns = [
[
"pattern" => '/@METHOD\((.*?)\)/',
"replace" => '<input type="hidden" id="_method" name="_method" value="$1"/>'
]
];
public static function searchAndReplace($source){
foreach(self::$patterns as $pattern ){
$source = preg_replace($pattern['pattern'], $pattern['replace'], $source);
}
return $source;
}
}
echo htmlspecialchars(DirectiveParser::searchAndReplace("@METHOD(PUT)"));
//<input type="hidden" id="_method" name="_method" value="PUT"/>
Prawie tak samo jak w Laravelu, tylko tam nazwa metody musi być w apostrofach. Opcjonalnie możemy to dodać:
class DirectiveParser {
protected static $patterns = [
[
"pattern" => "/@METHOD\('*(.*?)'*\)/",
"replace" => '<input type="hidden" id="_method" name="_method" value="$1"/>'
]
];
public static function searchAndReplace($source){
foreach(self::$patterns as $pattern ){
$source = preg_replace($pattern['pattern'], $pattern['replace'], $source);
}
return $source;
}
}
echo htmlspecialchars(DirectiveParser::searchAndReplace("@METHOD(PUT)"));
//<input type="hidden" id="_method" name="_method" value="PUT"/>
echo htmlspecialchars(DirectiveParser::searchAndReplace("@METHOD('PUT')"));
//<input type="hidden" id="_method" name="_method" value="PUT"/>
Możemy też użyć flagi i (case-insensitive) aby wielkość liter nie miała znaczenia:
class DirectiveParser {
protected static $patterns = [
[
"pattern" => "/@METHOD\('*(.*?)'*\)/i",
"replace" => '<input type="hidden" id="_method" name="_method" value="$1"/>'
]
];
//(...)
}
echo htmlspecialchars(DirectiveParser::searchAndReplace("@METHOD(PUT)"));
//<input type="hidden" id="_method" name="_method" value="PUT"/>
echo htmlspecialchars(DirectiveParser::searchAndReplace("@METHOD('PUT')"));
//<input type="hidden" id="_method" name="_method" value="PUT"/>
echo htmlspecialchars(DirectiveParser::searchAndReplace("@method(PUT)"));
//<input type="hidden" id="_method" name="_method" value="PUT"/>
Temat będziemy rozwijać.