2015-08-07 11 views
5

È possibile modificare il action classYii2 utilizza in qualche modo, in modo simile a come è possibile impostare la classe di molti altri componenti all'interno del file di configurazione?È possibile modificare la classe di azioni all'interno di Yii2?

Desidero estendere questa classe in modo da poter aggiungere un'altra variabile membro ad essa.

Immagino di poterlo aggiungere comunque in modo dinamico, ma preferirei farlo nel modo giusto.

Modifica: L'elenco di core application components non è elencato, quindi non è sicuro se è possibile?

+0

Immagino che dovrai estendere yii \ base \ Controller e riscrivere la funzione createAction per poter usare il tuo wrapper InlineAction personalizzato, poiché è codificato in questo codice. – apoq

risposta

1

Il modo corretto per risolvere questo problema è estendere sia il controller che le classi di azioni. Se si guarda il codice sorgente, yii\base\Controller ha un metodo createAction che, se non viene trovata alcuna azione di classe, creerà un'istanza di InlineAction.

Dal momento che si sta estendendo un qualche tipo di classe controller ogni volta che fate il vostro proprio controllore (class MyController extends Controller), si può semplicemente ignorare il metodo originale createAction e in essa utilizzare il proprio implementazione della classe InlineAction.

+0

Grazie per l'idea. Immagino che preferirei non dover scavalcare alcun metodo, visto che ha l'avvertenza di non voler aggiornare in futuro questi metodi (come userete il vostro metodo), ma immagino che questo sarebbe al momento il modo migliore per gestirlo. – Brett

+0

È un po 'strano che tu debba estendere 'InlineAction'. Qual è questo attributo che stai aggiungendo ad esso? – Beowulfenator

+0

Ho deciso di gestirlo in un modo diverso ora ed evitare di aggiungere l'attributo extra, ma sarebbe stato semplicemente un * nome * unico per l'azione sull'intera applicazione, poiché i diversi controller possono ovviamente avere identiche azioni con nome. – Brett

1

può essere fatto con class map

Yii::$classMap['yii\base\InlineAction'] = '@common/InlineAction.php'; 

e devono essere inseriti in index.php, prima che l'applicazione viene avviata.

Indipendentemente dalla posizione, common/InlineAction.php deve avere lo stesso spazio dei nomi yii\base come classe originale.

+0

Non dovrebbe essere impostato nel * processo di bootstrap * e non nel file * index.php * come indicato all'interno dei documenti? Inoltre, se gli dai lo stesso 'namespace', allora non sarai in grado di dargli lo stesso nome di classe? – Brett

+0

index.php * è * la parte del processo di avvio automatico, puoi chiamarlo script di entrata se suona meglio. Devi dargli lo stesso nome di classe, questo è il punto. Copia l'InlineAction.php di yii in una nuova posizione e modificalo. L'effetto collaterale è che non lascia alcuna possibilità di estendere la classe originale. – estus

+0

Mi spiace, intendevo la posizione del bootstrap all'interno del file di configurazione. Non penso di voler andare a quelle misure di dover spostare i file core, voglio solo un modo per estenderlo. Se non c'è un modo, suppongo che dovrò limitarmi a impostare dinamicamente la variabile membro. – Brett

Problemi correlati