2010-08-16 15 views
8

Qual è la migliore pratica per il posizionamento delle funzioni che vengono utilizzati su più layer MVC?Dove dovrebbero essere posizionate le funzioni "globali" di Symfony?

Recentemente ho dovuto scrivere alcune funzioni statistiche che vengono utilizzate sia nella vista che nel modello. Se li metto in un helper, sono bloccato a caricare aiutanti nel livello del modello, che è fastidioso, sembra scorretto e si interrompe completamente quando tali funzioni vengono chiamate da un'attività (perché non esiste un contesto predefinito). Se li ho messi nella directory di livello superiore lib, sono chiamate per la preparazione bloccati come Stats::normalPercentile nella vista.

Ci sono altre opzioni? Ci sono commenti dagli sviluppatori di Symfony su dove dovrebbero essere posizionate funzioni come queste?

Modifica: Apparentemente non ci sono problemi con le chiamate statiche nelle viste. Ho dedotto questo sulla base Symfony non scrivere i loro aiutanti come classi (anche dopo significant discussion.) In questo caso, ci sono delle convenzioni per l'inserimento dei file come questi? Basta lanciarli in lib/util?

risposta

7

Per quanto riguarda la tua modifica, aiutanti di symfony sono scritti del genere per evitare di ingombrare la vista con la sintassi che potrebbe essere sconosciuto a meno tecnico gente che normalmente entrano in contatto con un po 'di PHP - Funzioni di essere cittadini di prima classe in PHP 'vanilla' . È una filosofia tratta da Ruby on Rails, che ha ispirato questa parte del framework.

La memorizzazione di file in lib/ è una preferenza personale in quanto symfony non ci interessa, ma la nomenclatura suggerirebbe lib/vendor/yourname.

Se è buon codice, si potrebbe voler custodire gelosamente in quella piccola directory yourname ... se è davvero buon codice, si potrebbe desiderare di package it and share it with others :)

1

Cosa c'è di sbagliato nelle chiamate statiche? Penso che sia perfetto per le funzioni di supporto (meglio delle funzioni dato che hai una sorta di namespace).

È piuttosto strano raccogliere statistiche in una vista. Perché non lo fai in un'azione?

Probabilmente la risposta giusta dipende dal tipo di problema che stai cercando di risolvere (non hai spiegato cosa dovrebbero fare esattamente i tuoi aiutanti). Di solito utilizzo tali helper per attività comuni che non richiedono alcuna classe o chiamata aggiuntiva (come "stripText").

+0

Io sono d'accordo: niente di sbagliato con le chiamate statiche nei punti di vista Se l'OP non gli piace, deve creare un aiutante che li maschera. – Maerlyn

+0

Non sto raccogliendo statistiche nella vista, ma sto facendo calcoli come il percentile di un valore. Immagino di aver inferito (erroneamente) che le chiamate statiche non sono state rispettate nella vista perché Symfony non mette i loro aiutanti all'interno delle classi. –

0

I calcoli statistici non appartengono alla vista. Potresti aggiungerli al livello Model. Il lib/util o lib/model mi sembra a posto. Ad esempio si potrebbe avere una classe PercentileSequence che alimentava con i dati potrebbe essere riutilizzato in entrambi i vostri punti di vista e le attività di questo tipo:

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

dovrebbe essere la stessa all'interno di un compito.

+0

Si prega di non discutere la base della domanda. Riesci a concepire una funzione che deve essere chiamata sia in un modello che in una vista? Buona. Questo è ciò di cui sto parlando qui.Cavillare sul fatto che * questa specifica istanza * sia una di queste sta sminuendo la mia domanda. –

+0

Forse è per questo che sei bloccato con il caricamento di helper nel livello Model o chiamando metodi statici :) Comunque, ho votato la tua domanda. Spero che qualcuno arriverà con una buona risposta. – lunohodov

+0

La mia risposta iniziale è stata un po 'maleducata. Questo problema è un mio problema. Fidati di me che quello che sto facendo qui è sia appropriato che necessario :) –

Problemi correlati