2009-11-12 16 views
8

Sto usando CakePHP 1.2 e mi chiedo se ci sia qualche effetto collaterale sul passaggio dei dati $ this-> alla vista dal controller.

Es:

// inside PostsController, I have this code: 
$this->data['Posts'] = $this->Post->find('all'); 

invece di:

$posts = $this->Post->find('all'); 
$this->set(compact('posts')); 

// inside the /posts/view, I access it like this: 
<?php foreach ($this->data['Posts'] as $post) {....};?> 

Facendo questo, ho saltato il $ this-> set() dal controller tutti insieme. Ciò viola qualsiasi pattern MVC o qualsiasi problema di sicurezza che potrei trascurare? Ho visto che usando il componente Auth, $ this-> data contiene l'array [_Token].

Grazie

risposta

14

È necessario essere consapevoli dei diversi luoghi in cui gli helper di Cake cercano automaticamente i dati, poiché è ciò che fa davvero la differenza. Form Helper compilerà automaticamente i campi in base al contenuto di $this->data. Ecco come i dati dei moduli persistono quando la convalida fallisce. OTOH, un array di opzioni degli elementi <select> viene automaticamente preso dal nome del campo pluralizzato,
ad es. $form->select('Model.foo_id') prenderà le sue opzioni da $foos se impostato.

Come tale, $this->data ha il suo posto speciale e non dovrebbe essere usato alla leggera, proprio come le variabili nominate hanno il loro uso e non dovrebbero essere ignorate. Utilizzare entrambi come appropriato. Se non si desidera impostare automaticamente il contenuto di Form Helper, set() le variabili. IMHO è anche più leggibile assegnare un nome di variabile che alluda ai dati che contiene. Tutte le visualizzazioni che operano su $this->data sono meno chiare di una vista operante su $foo e un'altra su $bar.

3

$controller->data è pensato per i dati inviati ad il controllo dal file di visualizzazione.

$view->data è per dati generali.

Eviterei di farlo per mantenermi sano di mente. inoltre stai scrivendo più in vista.

+1

sono d'accordo con Funky Amico - $ this-> dati, dove $ questo è un modello, un controller, vista o un altro oggetto, penso che dovrebbe essere per i dati inviati da un modulo o letti da un record nel db . Penso che la tua versione sia molto meno leggibile e vada contro la convenzione a cui tutti sono abituati, rendendola molto meno portabile. Ma se vuoi davvero salvare una riga: $ this-> set ('posts', $ this-> Post-> find ('all')); – neilcrookes

2

Non c'è una buona ragione per impostare $ this-> data direttamente eccetto quando si lavora con i moduli.

Perché la convenzione di interruzione - Controller: set è lì per un motivo. Se si desidera trasferire dati alla vista per la visualizzazione o visualizzare gli scopi logici, utilizzare la funzione fornita anziché provare a co-optare Controller: i dati per scopi non previsti.

Tutto è più semplice da CakePHP se si seguono le regole e si fanno le cose nel modo previsto.

2

In cakephp versione 2. *, l'errore si verifica quando si tenta di impostare i dati su $this->data

7

In CakePHP 2.x si dovrebbe usare $this->request->data invece se pianura $this->data, altrimenti si potrebbe finire per ottenere questo errore:

Indirect modification of overloaded property View::$data has no effect

Problemi correlati