Модели CakePHP: почему методы экземпляра?

Почему именно все методы экземпляра методов модели CakePHP. Например:

$post = $this->Post->findById($id);

вместо

$post = Post::find($id);

Я думаю, что все методы, которые работают с экземплярами модели (или записями), будут методами экземпляра, например:

$post = ...;
$post->publish(); // Would be $this->Post->publish($id) using Cake

и все методы, которые создают или находят записи (которые работают с общей коллекцией записей), будут методами класса (методы экземпляра), например:

$post = Post::findById($id); // Would be $this->Post->findById($id) using Cake

$newPost = Post::create(['title' => 'My post', 'body' => '<p>...</p>']);
// Would be $newPost = $this->Post->create([...]); using Cake

Я думаю, что это соглашение Cake противоречит логическим соглашениям ООП. Кто-нибудь знает причину этого дизайна?

0

Решение

  • Статические вызовы или одиночные вызовы затрудняют использование внедрения зависимостей и затрудняют тестирование вашего кода. Вы создаете тесно связанный код — не хорошо. Ты хочешь Слабая связь.
  • Когда модели используются через ассоциации, создается новый экземпляр, поэтому существует свойство псевдонима модели. Вы можете привязать к нему совершенно другое поведение или изменить его состояние другими способами.
  • Вы хотите иметь возможность изменять и перегружать свойства и методы и создавать новые экземпляры на лету. Пример: иметь два экземпляра модели из одной и той же таблицы, но записывать в две БД. Это очень похоже на сценарий для приложений, которые используют соединения с БД, в зависимости от того, вошли ли вы, например, пользователь или vhost.
  • Вы явно не хотите проходить через это только для расширения модели: Расширение синглетонов в PHP

Я думаю, что это соглашение Cake противоречит логическим соглашениям ООП.
Кто-нибудь знает причину этого дизайна?

То, что вы описываете, не является ни логичным, ни хорошей практикой. Ну, вы могли бы предоставить некоторые ссылки, которые объяснили бы, почему вы рассматриваете это как «логические соглашения ООП». Там нет конвенций, но шаблоны проектирования. хорошо Варианты использования — это «служебные» классы, такие как классы внутри папки «Utility» в CakePHP. Нет необходимости иметь несколько их экземпляров.

Смотрите также эти вопросы и ссылки:

Если вы хотите «выглядеть» или думаете, что «вам это нужно», вы можете использовать Laravel вместо CakePHP, который чрезмерно использует рисунок фасада почти для всего. Но я гарантирую, что это не улучшит ваш код.

2

Другие решения

Других решений пока нет …