Где должны быть размещены «глобальные» функции Symfony? - PullRequest
8 голосов
/ 16 августа 2010

Каков наилучший способ размещения функций, которые используются в нескольких слоях MVC?

Недавно мне пришлось написать некоторые статистические функции, которые используются как в представлении, так и в модели. Если я помещаю их в помощник, я застреваю при загрузке помощников в слое модели, который раздражает, кажется неправильным и полностью ломается, когда эти функции вызываются из задачи (потому что нет контекста по умолчанию). Если я помещу их в каталог lib верхнего уровня, я застрял, делая вызовы типа Stats::normalPercentile в представлении.

Есть ли другие варианты? Есть ли какие-либо комментарии от разработчиков Symfony о том, где следует размещать подобные функции?

Редактировать : По-видимому, нет проблем с выполнением статических вызовов в представлениях. Я сделал это исходя из того, что Symfony не писал своих помощников как классы (даже после значительного обсуждения .). В таком случае, существуют ли какие-либо соглашения для размещения таких файлов? Просто бросьте их в lib/util?

Ответы [ 3 ]

7 голосов
/ 17 августа 2010

Что касается вашего редактирования, помощники Symfony написаны так, чтобы не загромождать представление синтаксисом, который может быть незнаком для менее технических людей, которые обычно соприкасаются с небольшим количеством PHP - функциями, являющимися первоклассными гражданами в «ванильном» PHP. Эта философия основана на Ruby on Rails, которая вдохновила эту часть фреймворка.

Хранение файлов в lib/ - это личное предпочтение, так как Symfony на самом деле не против, но номенклатура предполагает: lib/vendor/yourname.

Если это хороший код, вы можете ревниво оберегать его в этом маленьком yourname каталоге ... если это действительно хороший код, вы можете упаковать его и поделиться им с другие :)

1 голос
/ 16 августа 2010

Что не так со статическими звонками? Я думаю, что он идеально подходит для вспомогательных функций (лучше, чем функции, поскольку у вас есть своего рода пространство имен).

Довольно странно собирать статистику в представлении. Почему бы вам не сделать это в действии?

Вероятно, правильный ответ зависит от типа проблемы, которую вы пытаетесь решить (вы не объяснили, что именно должны делать ваши помощники). Я обычно использую такие помощники для общих задач, которые не требуют каких-либо дополнительных классов или вызовов (например, "stripText").

0 голосов
/ 17 августа 2010

Статистические расчеты не относятся к представлению.Попробуйте добавить их в слой модели.Мне кажется, что 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; ?>

Он должен быть таким же в задаче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...