Invocare Il Metodo Di Un Controller In Un Altro Controller

Buon giorno a tutti,

per qualche scomoda ragione mi trovo ad avere dei cloni di model-view-controller in /protected e in /protected/modules/admin.

In pratica ho bisogno di questa situazione.

Ora, il problema è che ogni volta che faccio una modifica in uno di questi 3 files (MVC) lo devo necessariamente fare anche nell’altro corrispondente.

Volevo sapere se c’era un modo per far si chè tutte le azioni che vengono richieste al controllore di /protected/controller vengano eseguite dal corrispondente controllore in /protected/modules/admin

Grazie.

Class-based actions.

http://www.yiiframework.com/doc/guide/1.1/en/basics.controller#action

Devi rimuovere una delle due versioni del codice. La ragione è semplice: la versione di controller che si trova su protected, potrebbe avere precedenza sull’altra. Tu non devi tenerle entrambe. Non ha senso fare due volte le modifiche.

Si ma servivano entrambe, una in admin per modifiche base, una pubblica in cui si possono effettuare tutte le modifiche.

ORey ti ha indicato il percorso, fai delle class based action.

Se il codice e’ lo stesso, puoi fare una classe per la action update con i vari parametri, se il codice e’ diverso, continua come stai facendo adesso.

Per esperienza il codice delle action e’ ripetitivo ma spesso variegato, nel senso che ci sono piccole differenze tra una action e l’altra che rendono scomodo il creare una class based action che vada bene per tutte.

Io preferisco duplicare il codice. Se sposti la logica nei model dovresti fare poche modfiche ai controller.

Se il codice che "agisce" è uno, quel codice non deve essere ripetuto. Ogni volta sei costretto a scrivere le cose due volte. Ti sei già reso conto che ti serve il doppio del tempo. Fermati e rifattorizza il codice. Isola quella porzione, rendila indipentente, richiamala in entrambi i punti. Una volta fatto questo, potrai fare le modifiche solo in un punto, avrai meno codice da guardare, meno errori da gestire, ed un codice più leggibile.