Smarty 5 não executa mais funções PHP nativas

Ao desencorajar o uso de funções PHP nativas diretamente nos templates Smarty, os desenvolvedores são incentivados a manter a lógica do lado do servidor no código PHP, enquanto os templates cuidam apenas da apresentação dos dados. Isso pode levar a uma separação mais limpa entre a lógica de negócios e a visualização, resultando em um código mais limpo e fácil de manter. No entanto, a discussão surge sobre se funções de tratamento de apresentação de strings ou formatação de números, por exemplo, devem ser incluídas nesse tipo de lógica.

A versão 5 do Smarty abandonou o suporte a funções nativas PHP, o que gerou uma grande discussão. Uma das primeiras threads sobre o assunto, embora não seja a maior, é a mais acalorada, com participação das pessoas mais relevantes do projeto, mostrando os principais pontos de vista sobre o assunto.

Por um lado, o principal mantenedor do projeto argumenta que essa mudança cria uma independência em relação às novas versões do PHP. Segundo ele, manter as funções nativas cria uma dependência de versões do PHP.

Outro mantenedor argumenta que o melhor cenário para o uso de templates é evitar o uso de funções nativas e criar plugins/modificadores para suprir essas necessidades.

No entanto, essa mudança traz algumas consequências, como a compatibilidade de templates existentes, que agora começam a gerar mensagens de "deprecated", o que quebra o primeiro argumento, pois ao resolver o problema de compatibilidade com o PHP, cria-se um problema de compatibilidade com o próprio Smarty. Além disso, há a questão da definição do que é lógica e o que é exibição. O uso de funções comuns, como strtoupper ou number_format, é parte da lógica ou da exibição?

Para resolver esse problema ao atualizar o Smarty, é necessário registrar novamente as funções, utilizando registerPlugin. Por exemplo:
$this->_smarty->registerPlugin("modifier", "strtotime", "strtotime");
Ou, de forma mais programática:
$natives = [
 "strtoupper", "strtolower", "str_replace", "ucfirst", "ucwords", "sprintf", "lcfirst", "ltrim", "rtrim", "trim", 
 "nl2br",
 "stripos", "strpos", "strlen", 
 "explode", "implode", 
 "number_format",
 "strtotime", "date", "time",
 "dechex",
 "var_dump",
 "md5", 
];
foreach($natives as $native) {
 $this->_smarty->registerPlugin("modifier", $native, $native);
}
Se ao atualizar seu Smarty, você se deparar com mensagens como:
Deprecated: Using unregistered function "strtotime" in a template is deprecated and will be removed in a future release. Use Smarty::registerPlugin to explicitly register a custom modifier. in /usr/share/nginx/html/unimedandradina.coop.br/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_modifier.php on line 113
ou
Deprecated: Using unregistered function "date" in a template is deprecated and will be removed in a future release. Use Smarty::registerPlugin to explicitly register a custom modifier. in /usr/share/nginx/html/unimedandradina.coop.br/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_modifier.php on line 113
Saiba que é possível resolver, com calma, e com bastante teste, mas é possivel resolver.

Em resumo, essa mudança é uma realidade e parece não haver volta, então o ideal é acompanhar as mudanças e se adaptar.