cakephp
Suggerimenti per la codifica di CakePHP3
Ricerca…
Creazione di un nuovo controller
namespace App\Controller;
class PostsController extends AppController {
public function initialize(){
parent::initialize();
// code that you want to run before every action
}
public function view($id) {
//Your code here
}
}
Aggiungi il metodo beforeFilter () in Controller
Il metodo beforeFilter () viene eseguito prima dell'esecuzione di qualsiasi altro metodo nel controller.
Prima usa lo spazio dei nomi Event prima di definire la classe nel tuo file controller.
use Cake\Event\Event;
Nel controller, aggiungere il metodo beforeFilter () come mostrato di seguito.
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
}
Oppure, puoi usare il metodo initialize() .
public function initialize(){
parent::initialize();
}
Passare le variabili alla vista
Passa ogni variabile da visualizzare alla volta
$this->set('color', 'pink');
$this->set('color', $color);
Passare più variabili per visualizzare insieme tramite la funzione compact ()
$color1 = 'pink';
$color2 = 'red';
$this->set(compact('color1', 'color2'));
Recupero dei dati dei post equivalenti a $ _POST
È possibile recuperare i dati del post come matrice.
$post_data= $this->request->data;
È possibile recuperare i dati dei post per una chiave particolare.
$this->request->data['field'];
Recupera un valore chiave specifico
$this->request->data('key_name');
Recupera il valore chiave specifico dell'array nidificato
$this->request->data('data.subfield');
la differenza tra la notazione dell'array e il metodo data() è che data() è sicura da errori e restituisce null se la chiave non esiste nell'array
così intenti di fare
if(isset($this->request->data['field']) && $this->request->data['field']) { ...}
tu puoi fare
if($this->request->data('field')) { ...}
per CakePHP 3.4.x +
ottieni tutti i dati:
$this->request->getData();
ottieni la chiave specifica:
$this->request->getData('key');
per impostare i dati disponibili per la funzione getData devi fare qualcosa del tipo:
$this->request = $this->request->withData('some_key_on_the_fly', 'value');
$some_key_on_the_fly = $this->request->getData('some_key_on_the_fly');
utile per l'aggiornamento dei modelli nel controller con dati statici
Carica un altro modello nel controller
Di default CakePHP carica il modello correlato nel controller. Per caricare un altro modello nel controller, utilizzare il metodo loadModel ():
$this->loadModel('Articles');
o caricare al volo
$table = TableRegistry::get('Articles');
$table->find();
Reindirizzamento a un'altra pagina dal Controller
Reindirizzare all'interno dell'applicazione (un'altra azione di un controller specifico).
return $this->redirect([
'controller' => 'myController',
'action' => 'myAction'
]);
Reindirizza alla pagina dei referrer
return $this->redirect($this->referer());
Reindirizzare all'esterno dell'applicazione o URL specifico
return $this->redirect("http://stackoverflow.com/users/1793428/haresh-vidja");
Passaggio da variabile a azione dall'URL con reindirizzamento
Passare la variabile in URL come parametro di un metodo
return $this->redirect([
'controller' => 'users',
'action' => 'profile',
$id
]);
L'URL dovrebbe essere simile a questo http: // tuo_app_url / utenti / profilo / {id}
nel file UsersController.php nel metodo profile ()
class UsersController extends Controller {
public function profile($id=null) {
$userData=$this->Users->get($id);
}
}
Passare la variabile in URL come stringa di query
return $this->redirect([
'controller' => 'users',
'action' => 'profile',
'?'=>['id'=>$id]
]);
L'URL dovrebbe essere simile a questo http: // your_app_url / users / profile /? Id = {id}
nel file UsersController.php nel metodo profile ()
class UsersController extends Controller {
public function profile() {
$userData=$this->Users->get($this->request->query('id'));
}
}
Imposta o modifica il layout dell'applicazione
Imposta il layout predefinito per l'intera applicazione . cioè, creato il file di layout in /src/Template/Layout/admin.ctp
class AppsController extends Controller {
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
$this->viewBuilder()->layout('admin'); // For Version >= 3.1 or
$this->layout = 'admin'; // for version < 3.1
// your other code should be here
}
}
Imposta il layout predefinito per un'azione specifica nell'applicazione . cioè, l'applicazione ha un layout diverso nella pagina di accesso in /src/Template/Layout/login.ctp
class UsersController extends Controller {
public function login() {
$this->viewBuilder()->layout('login'); // For Version >= 3.1 or
$this->layout = 'login'; // for version < 3.1
//your other code should be here
}
}
Cambia layout per controller specifico . per esempio, hai bisogno di un layout diverso per tutti i metodi del controller specifico
class UsersController estende il controller {
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
$this->viewBuilder()->layout('user_layout'); // For Version >= 3.1 or
$this->layout = 'user_layout'; // for version < 3.1
//your other code should be here
}
}
Imposta il layout della richiesta Ajax
Generalmente nella richiesta AJAX non è necessario caricare CSS, JS. Anche omettendo altro codice HTML.
Crea un file ajax.ctp in / src / Template / Layout e il codice dovrebbe essere
<?php
$this->fetch('content');
Imposta il layout basato su AJAX per l'intera applicazione, in AppsController.php
la classe AppsController estende il controller {
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
if($this->request->isAjax())
{
$this->viewBuilder()->layout('ajax'); // For Version >= 3.1 or
$this->layout = 'ajax'; // for version < 3.1
}
else
{
$this->viewBuilder()->layout('admin'); // For Version >= 3.1 or
$this->layout = 'admin'; // for version < 3.1
}
// your other code should be here
}
}
Carica componenti in CakePHP
Possiamo caricare i componenti in due modi.
- Inizializza o sovrascrive la proprietà $ components in Controller
- Usando il metodo loadComponent () nel metodo initialize () di Controller.
Way-1 Dovrebbe essere l'override del componente di caricamento da parte di AppsController.php caricare uno o più componenti
class UsersController extends AppController {
public $components = ['RequestHandler','Auth','Flash'];
}
Way-2 Utilizzare in questo modo quando è necessario caricare il componente in modo dinamico per controller specifici. Carica un componente
class UsersController extends AppController {
public function initialize() {
parent::initialize();
$this->loadComponent("RequestHandler"); // load specific component
$this->loadComponent(["RequestHandler","Auth","Flash"]); // load specific component
}
}
Cos'è il metodo initilaize ()?
initialize () è stato introdotto in CakePHP versione> 3.0
Come una struttura di codice, sembra uguale al metodo beforeFilter (). ma ci sono molte differenze tra beforeFilter () e initialize ().
- initialize () viene sempre chiamato dopo la chiamata del costruttore. ma beforeFilter () non sta chiamando in caso di metodo di azione non trovato in particolare controller.
- Il metodo initialize () viene generalmente utilizzato per inizializzare qualcosa come aggiungere nuovi componenti e helper. ma in beforeFilter () viene generalmente utilizzato per eseguire parte logica globale.
Dati della stringa di query Retrive equivalenti a $ _GET
È possibile recuperare i dati della stringa di query come matrice.
$post_data= $this->request->query;
È possibile recuperare i dati dei post per una chiave particolare.
$this->request->query['field'];
Recupera un valore chiave specifico
$this->request->query('key_name');
Recupera il valore chiave specifico dell'array nidificato
$this->request->query('data.subfield');
Creazione della classe Tabella (modello)
Come creare la classe del modello utente
namespace App\Model\Table;
use Cake\ORM\Table;
class UsersTable extends Table {
public function initialize(array $config) {
$this->table('users'); //define table name
$this->displayField('username'); // unique or other special field of users table
$this->primaryKey('id'); // primary key of users table
$this->tablePrefix('prefix_'); // if prefix set tablename should be prefix_users
// your other code here
}
// your other methods here
}
Associazioni di modelli in CakePHP
Esistono 4 tipi di associazioni (relazioni) che possiamo definire in CakePHP
class PostsTable extends Table {
public function initialize(array $config) {
// table initialization code should be here
$this->belongsTo('Authors', [
'className' => 'Authors',
'foreignKey' => 'author_id',
'joinType' => 'INNER',
]);
$this->hasMany('Tags');
$this->hasOne('Categories');
$this->hasAndBelongsToMany('Topics');
}
}
Nell'esempio sopra, puoi vedere 4 tipi di relazioni
Il post appartiene all'autore (One to One) , significa che nella tabella dei posts è presente una chiave straniera author_id che è associata alla tabella id of authors .
Messaggio ha molte Tag (uno a molti), significa in tags tabella ha una chiave esterna post_id che è associato con id di posts tavola.
Il post ha un tag (molti a uno o uno a uno) , significa che nella tabella dei posts è presente una chiave straniera category_id che è associata id della tabella delle categories .
Post ha e appartiene a Topics (Many to Many) , questa è una relazione molte a molte tra posts e topics table. per mantenere molti a molti relazione deve essere necessario creare la terza tabella, tabella, il nome della tabella dovrebbe essere posts_categories . Campi di questa tabella come indicato di seguito
- id (chiave primaria della tabella)
- post_id (tabella chiave esterna dei
posts) - topic_id (tabella chiave esterna della tabella degli
topics)