2014-09-15 2 views
0

Почему именно методы метода экземпляров модели CakePHP Model. Например:Модели 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 

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

+2

Это почти наверняка, потому что каждая модель нуждается в возможности иметь индивидуальные настройки, и поэтому лучше, чтобы модель могла иметь состояние для хранения этих параметров. Например, отношения модели и правила валидации обычно используются параметрами, которые сильно варьируются между отдельными моделями. – Kai

+0

Но как насчет статических переменных? Например: class Post extends Model { static $ validations = array (...); static $ принадлежитTo = 'Пользователь'; } – user1065745

+0

Статические свойства не могут быть перезаписаны наследованием, и, конечно, все пользовательские модели в CakePHP наследуют от модели, поэтому это не будет работать. http://stackoverflow.com/questions/532754/inheritance-of-static-members-in-php – Kai

ответ

2
  • Статические вызовы или одиночные игры затрудняют использование инъекции зависимостей и затрудняют проверку кода. Вы создаете жестко связанный код - не хорошо. Вы хотите loose coupling.
  • Когда модели используются через ассоциации, создается новый экземпляр, поэтому существует свойство alias модели. Вы можете привязать к нему совершенно другое поведение или изменить его состояние другими способами.
  • Вы хотите иметь возможность изменять и перегружать свойства и методы и создавать новые экземпляры «на лету». Пример: наличие двух экземпляров модели из одной таблицы, но запись в две базы данных. Это очень похоже на сценарий для приложений, использующих соединения БД, например, в зависимости от зарегистрированных пользователей или vhost.
  • Вы явно не хотите, чтобы пройти через это только расширить модель: Extending singletons in PHP

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

То, что вы описываете, не является логичным и не является хорошей практикой. Ну, вы могли бы предоставить некоторые ссылки, которые объясняли бы, почему вы считаете это «логическими соглашениями ООП». Нет соглашений, кроме design patterns. A good use case являются «полезными» классами, такими как классы внутри папки «Utility» CakePHP. Нет необходимости иметь несколько экземпляров из них.

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

Если вы хотите, чтобы "смотреть" или думаете, что "нужно" это, вы можете использовать Laravel вместо CakePHP, который делает exce ssive использование facade pattern практически для всех. Но я гарантирую, что это не улучшит ваш код.

Смежные вопросы