Impedire di richiamare una Action da un URL

A volte si creano delle action al solo scopo di utilizzarle con requestAction e non si vuole che l’utente le richiami attraverso l’URL.

Il metodo più semplice è quello di rendere privata la action nominandola con una stringa che inizia con “_”. In questo caso è possibile richiamarla solo come metodo privato con tutte le limitazioni del caso, ma non con requestAction.

Per utilizzarle con requestAction si può effettuare un controllo prima dell’esecuzione dell’action stessa

if($this->params['bare'] === true){

     // esegue l'azione

}

Il parametro ‘bare’ impostato a true indica che la richiesta è arriavata da Ajax o da requestAction(), mentre se impostato a false la richiesta è diretta

3 comments for “Impedire di richiamare una Action da un URL

  1. cwxwwwxdfvwwxwx
    24 dicembre 2008 at 23:17

    well, hi admin adn people nice forum indeed. how’s life? hope it’s introduce branch ;)

  2. 26 agosto 2008 at 11:34

    @Namaless
    Il problema non si pone nel controller, ma nella view.
    Ad esempio vorrei poter disporre di un elenco di categorie nella view per creare un menu, senza necessariamente dover ricorrere ad Ajax, quindi eseguo una requestAction nella view di un’action che mi restituisce un array delle categorie.
    Nei tuoi esempi validi solo per i controller, il primo è adottabile solo per chiamate Ajax e nel secondo si ha accesso solo se il metodo è chiamato dalla classe stessa o da una classe estesa, altrimenti essendo privata non è accessibile con requestAction (se non sbaglio).

  3. 23 agosto 2008 at 13:23

    Visto che php4 è morto e che dobbiamo iniziare a pensare “solo” a php5 direi che sia meglio utilizzare 2 sistemi alternativi:
    1. Uso dei controlli sulla chiamata: immagina di avere una lista di commenti che vuoi caricare con ajax nella view. La cosa più banale è usare una cosa del genere
    // ./app/controllers/comments_controller.php
    class CommentsController extends AppController
    {
    var $name = 'Comments';

    function index()
    {
    if ( $this->RequestHandler->isAjax() )
    {
    $this->set('comments', $this->Comment->find('all'));
    }
    }

    2. sulla base del codice di prima:
    // ./app/controllers/comments_controller.php
    class CommentsController extends AppController
    {
    var $name = 'Comments';

    private function index()
    {
    $this->set('comments', $this->Comment->find('all'));
    }

    Che ne pensi?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *