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ć.