cakephp
Conseils de codage CakePHP3
Recherche…
Créer un nouveau contrôleur
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
}
}
Ajouter la méthode beforeFilter () dans Controller
La méthode beforeFilter () s'exécute avant toute autre méthode exécutée dans le contrôleur.
Utilisez d'abord l'espace de noms Event avant de définir la classe dans votre fichier de contrôleur.
use Cake\Event\Event;
Dans votre contrôleur, ajoutez la méthode beforeFilter () comme indiqué ci-dessous.
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
}
Ou, vous pouvez utiliser la méthode initialize() .
public function initialize(){
parent::initialize();
}
Passer des variables à la vue
Passer chaque variable à afficher à la fois
$this->set('color', 'pink');
$this->set('color', $color);
Passer plusieurs variables à visualiser ensemble via la fonction compact ()
$color1 = 'pink';
$color2 = 'red';
$this->set(compact('color1', 'color2'));
Récupération de données de post équivalentes à $ _POST
Vous pouvez récupérer des données de publication en tant que tableau.
$post_data= $this->request->data;
Vous pouvez récupérer des données post pour une clé particulière.
$this->request->data['field'];
Récupérer une valeur de clé spécifique
$this->request->data('key_name');
Récupérer une valeur de clé spécifique d'un tableau imbriqué
$this->request->data('data.subfield');
la différence entre la notation du tableau et data() méthode data() est que data() est sans erreur et renvoie null si la clé n'existe pas dans le tableau
tellement de faire
if(isset($this->request->data['field']) && $this->request->data['field']) { ...}
tu peux faire
if($this->request->data('field')) { ...}
pour CakePHP 3.4.x +
obtenir toutes les données:
$this->request->getData();
obtenir une clé spécifique:
$this->request->getData('key');
pour définir les données disponibles pour la fonction getData, vous devez faire quelque chose comme:
$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 pour mettre à jour les modèles dans le contrôleur avec des données statiques
Charger un autre modèle dans le contrôleur
Par défaut, CakePHP charge le modèle associé dans le contrôleur. Pour charger un autre modèle dans le contrôleur, utilisez la méthode loadModel ():
$this->loadModel('Articles');
ou charger à la volée
$table = TableRegistry::get('Articles');
$table->find();
Redirection vers une autre page du contrôleur
Rediriger dans l'application (une autre action du contrôleur spécifique).
return $this->redirect([
'controller' => 'myController',
'action' => 'myAction'
]);
Rediriger vers la page de référence
return $this->redirect($this->referer());
Rediriger en dehors de l'application ou de l'URL spécifique
return $this->redirect("http://stackoverflow.com/users/1793428/haresh-vidja");
Passage d'une variable à une action à partir d'une URL avec redirection
Passer une variable dans l'URL comme paramètre d' une méthode
return $this->redirect([
'controller' => 'users',
'action' => 'profile',
$id
]);
L'URL devrait ressembler à ceci : http: // your_app_url / users / profile / {id}
dans le fichier UsersController.php de la méthode profile ()
class UsersController extends Controller {
public function profile($id=null) {
$userData=$this->Users->get($id);
}
}
Passer une variable dans l'URL en tant que chaîne de requête
return $this->redirect([
'controller' => 'users',
'action' => 'profile',
'?'=>['id'=>$id]
]);
L'URL devrait ressembler à ceci : http: // votre_app_url / users / profile /? Id = {id}
dans le fichier UsersController.php de la méthode profile ()
class UsersController extends Controller {
public function profile() {
$userData=$this->Users->get($this->request->query('id'));
}
}
Définir ou modifier la disposition de l'application
Définissez la mise en page par défaut pour l’ensemble de l’application . c'est-à-dire, fichier de mise en page créé dans /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
}
}
Définissez la mise en page par défaut pour une action spécifique dans l'application . c'est-à-dire que l'application a une disposition différente dans la page de connexion dans /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
}
}
Modifier la mise en page pour un contrôleur spécifique . par exemple, vous avez besoin d'une mise en page différente pour toute méthode de contrôleur spécifique
la classe UsersController étend 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
}
}
Définir la disposition de la requête Ajax
Généralement dans AJAX demande pas besoin de charger CSS, JS. En omettant également d'autres codes HTML.
Créer le fichier ajax.ctp dans / src / Template / Layout, et le code devrait être
<?php
$this->fetch('content');
Définir la mise en page basée sur AJAX pour l'application entière, dans AppsController.php
class AppsController étend 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
}
}
Charger des composants dans CakePHP
Nous pouvons charger des composants de deux manières.
- Par initialiser ou remplacer la propriété $ components dans Controller
- En utilisant la méthode loadComponent () dans la méthode initialize () du contrôleur.
Way-1 Il devrait être surcharger le composant par AppsController.php charger un ou plusieurs composants
class UsersController extends AppController {
public $components = ['RequestHandler','Auth','Flash'];
}
Way-2 Utilisez cette méthode lorsque vous avez besoin d'un composant de chargement dynamique pour un contrôleur spécifique. Charger un composant
class UsersController extends AppController {
public function initialize() {
parent::initialize();
$this->loadComponent("RequestHandler"); // load specific component
$this->loadComponent(["RequestHandler","Auth","Flash"]); // load specific component
}
}
Quelle est la méthode initilaize ()?
initialize () est introduit dans la version de CakePHP> 3.0
En tant que structure de code, elle ressemble à la méthode beforeFilter (). mais il y a beaucoup de différences entre beforeFilter () et initialize ().
- initialize () est toujours appelée après l'appel du constructeur. mais beforeFilter () n'appelle pas en cas de méthode d'action introuvable dans un contrôleur particulier.
- La méthode initialize () est généralement utilisée pour initialiser quelque chose comme ajouter de nouveaux composants et assistants. mais dans beforeFilter () est généralement utilisé pour exécuter une partie logique globale.
Retracer des données de chaîne de requête équivalentes à $ _GET
Vous pouvez récupérer des données de chaîne de requête sous forme de tableau.
$post_data= $this->request->query;
Vous pouvez récupérer des données post pour une clé particulière.
$this->request->query['field'];
Récupérer une valeur de clé spécifique
$this->request->query('key_name');
Récupérer une valeur de clé spécifique d'un tableau imbriqué
$this->request->query('data.subfield');
Création d'une classe de table (modèle)
Comment créer une classe de modèle d'utilisateur
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
}
Associations de mannequins à CakePHP
Il y a 4 types d'associations (relations) que nous pouvons définir dans 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');
}
}
Dans l'exemple ci-dessus, vous pouvez voir 4 types de relations
Post appartient à Author (One to One) , cela signifie que la table des posts a une clé étrangère author_id associée à la table id of authors .
Post a beaucoup de balises (One to Many) , cela signifie tags table des tags contient une clé étrangère post_id associée à l' id de la table des posts .
Publier a une balise (plusieurs à un ou un à un) , cela signifie que la table des posts a une clé étrangère category_id associée à la table id de categories .
Post a et appartient à Topics (Many to Many) , il y a beaucoup à beaucoup de relations entre les posts et la table des topics . pour entretenir plusieurs relations doivent avoir besoin de créer une troisième table, table, le nom de la table devrait être posts_categories . Champs de cette table comme mentionné ci-dessous
- id (clé primaire de la table)
- post_id (clé étrangère de la table des
posts) - topic_id (clé étrangère de la table des
topics)