2010-08-16 21 views
8

¿Cuál es la mejor práctica para la colocación de funciones que se utilizan en múltiples capas MVC?¿Dónde deberían colocarse las funciones Symfony "globales"?

Recientemente tuve que escribir algunas funciones de estadísticas que se usan tanto en la Vista como en el Modelo. Si los pongo en un helper, estoy atascado cargando helpers en la capa del modelo, lo cual es molesto, parece incorrecto y se rompe por completo cuando se invocan esas funciones desde una tarea (porque no hay un contexto predeterminado). Si los coloco en el directorio de nivel superior lib, estoy atascado haciendo llamadas como Stats::normalPercentile en la vista.

¿Hay alguna otra opción? ¿Hay algún comentario de los desarrolladores de Symfony sobre dónde deben colocarse funciones como estas?

Editar: Aparentemente, no hay problemas para realizar llamadas estáticas en las vistas. Deduje esto basado en que Symfony no escribió sus ayudantes como clases (incluso después de significant discussion). En ese caso, ¿hay alguna convención para colocar archivos como estos? ¿Simplemente tíralos en lib/util?

Respuesta

7

En cuanto a su edición, los ayudantes de Symfony se escriben así para evitar saturar la vista con una sintaxis que podría ser desconocida para personas menos técnicas que normalmente entran en contacto con un pequeño PHP. Funciones que son ciudadanos de primera clase en PHP 'vanilla' . Es una filosofía extraída de Ruby on Rails, que inspiró esta parte del marco.

Almacenar archivos en lib/ es una preferencia personal ya que a Symfony no le importa, pero la nomenclatura sugeriría lib/vendor/yourname.

Si se trata de un buen código, es posible que desee guardar celosamente en ese pequeño directorio yourname ... si es realmente buen código, es posible que desee package it and share it with others :)

1

¿Qué pasa con las llamadas estáticas? Creo que es perfecto para las funciones de ayuda (mejor que las funciones ya que tiene un tipo de espacio de nombres).

Es bastante extraño recopilar estadísticas en una vista. ¿Por qué no lo haces en una acción?

Probablemente la respuesta correcta depende del tipo de problema que está tratando de resolver (no explicó qué deberían hacer exactamente sus ayudantes). Por lo general, utilizo dichos ayudantes para tareas comunes que no requieren clases o llamadas adicionales (como "stripText").

+0

Estoy de acuerdo: no hay nada malo con las llamadas estáticas en las vistas Si al OP no le gusta, creará un ayudante que los enmascare. – Maerlyn

+0

No estoy recopilando estadísticas en la vista, pero estoy haciendo cálculos como el percentil de un valor. Supongo que deduje (incorrectamente) que las llamadas estáticas estaban mal vistas en la vista porque Symfony no coloca sus ayudantes dentro de las clases. –

0

Los cálculos estadísticos no pertenecen a la Vista. Considere agregarlos a la capa Modelo. El lib/util o lib/model me parece bien. Por ejemplo, usted podría tener una clase PercentileSequence que alimentó con datos podría ser reutilizado en ambos puntos de vista y sus tareas como esta:

// 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; ?> 

Debe ser la misma dentro de una tarea.

+0

No debatir la base de la pregunta. ¿Puede concebir una función que necesite ser llamada tanto en un modelo como en una vista? Bueno. De eso es de lo que estoy hablando aquí.Preguntar si * esta instancia específica * es una de ellas está desvirtuando mi pregunta. –

+0

Quizás esta es la razón por la que está atascado con la carga de ayudantes en la capa de Modelo o llamando a métodos estáticos :) De todos modos, voté su pregunta. Espero que alguien venga con una buena respuesta. – lunohodov

+0

Mi respuesta inicial fue un poco grosera. Este es un problema que me molesta. Confía en mí que lo que estoy haciendo aquí es apropiado y necesario :) –

Cuestiones relacionadas