Phpstan неопределенный (магический?) метод

В CakePHP; ORM поддерживает уровень абстракции функций SQL; поэтому вы можете использовать такие функции, как «СУММ» и «МАКС». Эти функции определены в FunctionBuilder. Cake также позволяет использовать пользовательские функции; Я не понимаю реализацию, но пример приведен ниже:

    //.. 
    $foo->select([
        'another_field' => $foo->func()->sum('total'), // is a defined method
        'field_name' => $foo->func()->date_format([  // date_format is not defined; but it is a valid function
            'another_field' => 'identifier', 
            "'%M %Y'" => 'literal'
          ]) 
    ]);

phpstan сообщает

235    Call to an undefined method Cake\Database\FunctionsBuilder::date_format().

Я понимаю, почему phpstan сообщает об этом; но я недостаточно знаю, как подавить это. Предлагается создать метод в файле FunctionsBuilder, но это приведет к внесению изменений в файлы поставщиков.

Интернет советует не игнорировать это предупреждение; но в равной степени в текущем использовании это не проблема, поэтому можно надеяться, что в phpstan есть флаг «игнорировать» сообщение или /*@var ... override? */

🤔 А знаете ли вы, что...
CakePHP позволяет разрабатывать приложения, следуя принципам RESTful архитектуры.


97
1

Ответ:

Решено

Чтобы решить «Вызов неопределенного метода», у вас есть несколько вариантов:

  1. Вы можете использовать файлы-заглушки для переопределения PHPDoc над классом FunctionsBuilder. Вы можете предоставить волшебные теги @method PHPDoc для описания этих дополнительных методов, которые существуют благодаря __call:
namespace Cake\Database;

/**
 * @method string dateFormat(array<mixed> $args)
 */
class FunctionsBuilder
{
}
  1. Вы можете написать собственное расширение отражения класса, которое позволит вам гибко определять, какие магические методы существуют в классе - вы можете перечислить, какие функции базы данных действительны на основе некоторой пользовательской логики.