Как лучше всего разместить функции, которые используются на нескольких уровнях MVC?
Недавно мне пришлось написать несколько статистических функций, которые используются как в представлении, так и в модели. Если я помещаю их в помощник, я застреваю при загрузке помощников на уровне модели, что раздражает, кажется неправильным и полностью ломается, когда эти функции вызываются из задачи (потому что нет контекста по умолчанию). Если я помещаю их в каталог верхнего уровня lib
, я застреваю в вызовах типа Stats :: normalPercentile
в представлении.
Есть ли другие варианты? Есть ли какие-либо комментарии от разработчиков Symfony о том, где должны быть размещены такие функции?
Edit : По-видимому, нет проблем с выполнением статических вызовов в представлениях. Я сделал вывод, основываясь на том, что Symfony не пишет своих помощников в виде классов (даже после значительного обсуждения .) В таком случае, существуют ли какие-либо соглашения для размещения таких файлов? Просто поместите их в lib / util
?
Что касается вашего редактирования, помощники symfony написаны так, чтобы избежать загромождения представления синтаксисом, который может быть незнаком менее техническим люди, которые обычно имеют дело с небольшим количеством PHP - функций, будучи первоклассными гражданами в «ванильном» PHP. Это философия, взятая из Ruby on Rails, которая вдохновила эту часть фреймворка.
Хранение файлов в lib /
- это личное предпочтение, так как symfony на самом деле не возражает, но номенклатура предполагает lib / vendor / yourname
.
Если это хороший код, вы можете ревностно охранять его в этой маленькой директории yourname
... если это действительно хороший код, вы можете упаковать его и поделитесь им с другими :)
Что не так со статическими вызовами? Я думаю, что это идеально подходит для вспомогательных функций (лучше, чем для функций, поскольку у вас есть своего рода пространство имен).
Довольно странно собирать статистику в представлении.Почему бы вам не сделать это в действии?
Вероятно, правильный ответ зависит от типа проблемы, которую вы пытаетесь решить (вы не объяснили, что именно должны делать ваши помощники). Я обычно использую такие помощники для общих задач, которые не требуют дополнительных классов или вызовов (например, «stripText»).
Статистические вычисления не относятся к просмотру. Подумайте о добавлении их на слой модели. lib / util
или lib / model
мне кажутся подходящими. Например, у вас может быть класс PercentileSequence
, который содержит данные, которые можно повторно использовать как в ваших представлениях, так и в задачах, например:
// in your action, component or task
$this->mySequence = new PercentileSequence($data);
// in your view (if PercentileSequence implements Iterator)
<?php foreach ( $mySequence as $rank ): ?>
<?php echo $rank ?>
<?php endforeach; ?>
// or use plain old array
<?php foreach ( $mySequence->getRanks() as $rank ): ?>
<?php echo $rank ?>
<?php endforeach; ?>
Он должен быть таким же внутри задачи.