cakephp
CakePHP3-Codiertipps
Suche…
Neuen Controller erstellen
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
}
}
Fügen Sie die Methode beforeFilter () im Controller hinzu
Die beforeFilter () -Methode wird ausgeführt, bevor andere Methoden im Controller ausgeführt werden.
Verwenden Sie zuerst den Ereignis-Namespace, bevor Sie die Klasse in Ihrer Controller-Datei definieren.
use Cake\Event\Event;
Fügen Sie in Ihrem Controller die Methode beforeFilter () hinzu, wie unten gezeigt.
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
}
Oder Sie können die initialize() -Methode verwenden.
public function initialize(){
parent::initialize();
}
Variablen an View übergeben
Übergeben Sie jede Variable, um sie gleichzeitig anzuzeigen
$this->set('color', 'pink');
$this->set('color', $color);
Übergeben Sie mehrere Variablen, um sie zusammen mit der Funktion compact () anzuzeigen
$color1 = 'pink';
$color2 = 'red';
$this->set(compact('color1', 'color2'));
Abrufen von Post-Daten, die $ _POST entsprechen
Sie können Post-Daten als Array abrufen.
$post_data= $this->request->data;
Sie können die Postdaten für einen bestimmten Schlüssel abrufen.
$this->request->data['field'];
Bestimmten Schlüsselwert abrufen
$this->request->data('key_name');
Ruft einen bestimmten Schlüsselwert eines verschachtelten Arrays ab
$this->request->data('data.subfield');
Der Unterschied zwischen der Array-Notation und der data() -Methode besteht darin, dass data() fehlersicher ist und null zurückgibt, wenn der Schlüssel nicht im Array vorhanden ist
so viel zu tun
if(isset($this->request->data['field']) && $this->request->data['field']) { ...}
du kannst tun
if($this->request->data('field')) { ...}
für CakePHP 3.4.x +
Alle Daten abrufen:
$this->request->getData();
bestimmten Schlüssel erhalten:
$this->request->getData('key');
Um Daten für die getData-Funktion verfügbar zu machen, müssen Sie Folgendes tun:
$this->request = $this->request->withData('some_key_on_the_fly', 'value');
$some_key_on_the_fly = $this->request->getData('some_key_on_the_fly');
nützlich für die Aktualisierung der Modelle im Controller mit statischen Daten
Laden Sie ein anderes Modell in den Controller
Standardmäßig lädt CakePHP das zugehörige Modell in den Controller. Um ein anderes Modell in den Controller zu laden, verwenden Sie die loadModel () -Methode:
$this->loadModel('Articles');
oder laden Sie on the fly
$table = TableRegistry::get('Articles');
$table->find();
Umleitung von Controller zu einer anderen Seite
Weiterleitung in Anwendung (andere Aktion eines bestimmten Controllers).
return $this->redirect([
'controller' => 'myController',
'action' => 'myAction'
]);
Weiterleitung auf Verweisseite
return $this->redirect($this->referer());
Weiterleitung außerhalb der Anwendung oder einer bestimmten URL
return $this->redirect("http://stackoverflow.com/users/1793428/haresh-vidja");
Variable an Aktion von URL mit Weiterleitung übergeben
Variable in URL als Parameter einer Methode übergeben
return $this->redirect([
'controller' => 'users',
'action' => 'profile',
$id
]);
Die URL sollte folgendermaßen aussehen : http: // your_app_url / users / profile / {id}
in der Datei UsersController.php in der Methode profile ()
class UsersController extends Controller {
public function profile($id=null) {
$userData=$this->Users->get($id);
}
}
Variable in URL als Abfragezeichenfolge übergeben
return $this->redirect([
'controller' => 'users',
'action' => 'profile',
'?'=>['id'=>$id]
]);
Die URL sollte folgendermaßen aussehen : http: // your_app_url / users / profile /? Id = {id}
in der Datei UsersController.php in der Methode profile ()
class UsersController extends Controller {
public function profile() {
$userData=$this->Users->get($this->request->query('id'));
}
}
Legen Sie das Layout der Anwendung fest oder ändern Sie es
Legen Sie das Standardlayout für die gesamte Anwendung fest . dh erstellte Layout-Datei 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
}
}
Legen Sie das Standardlayout für bestimmte Aktionen in der Anwendung fest . Die Anwendung hat also ein anderes Layout in der Anmeldeseite 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
}
}
Ändern Sie das Layout für einen bestimmten Controller . B. benötigen Sie ein anderes Layout für alle Methoden der einzelnen Controller
Klasse UsersController erweitert 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
}
}
Legen Sie das Ajax-Anforderungslayout fest
In der AJAX-Anforderung ist im Allgemeinen kein Laden von CSS, JS erforderlich. Auslassen von anderem HTML-Code.
Erstellen Sie die Datei ajax.ctp in / src / Template / Layout, und der Code sollte sein
<?php
$this->fetch('content');
Legen Sie das AJAX-basierte Layout für die gesamte Anwendung in AppsController.php fest
Klasse AppsController erweitert 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
}
}
Komponenten in CakePHP laden
Wir können Komponenten auf zwei Arten laden.
- Durch Initialisieren oder Überschreiben der $ components-Eigenschaft in Controller
- Durch Verwendung der loadComponent () -Methode in der initialize () -Methode des Controllers.
Möglichkeit -1 Es sollte eine Ladekomponente überschrieben werden, indem AppsController.php eine oder mehrere Komponenten lädt
class UsersController extends AppController {
public $components = ['RequestHandler','Auth','Flash'];
}
Weg-2 Verwenden Sie diesen Weg, wenn Sie Komponenten dynamisch für bestimmte Controller laden müssen. Laden Sie eine Komponente
class UsersController extends AppController {
public function initialize() {
parent::initialize();
$this->loadComponent("RequestHandler"); // load specific component
$this->loadComponent(["RequestHandler","Auth","Flash"]); // load specific component
}
}
Was ist die Methode initilaize ()?
initialize () wird in CakePHP Version> 3.0 eingeführt
Als Codestruktur sieht sie genauso aus wie die beforeFilter () -Methode. Es gibt jedoch viele Unterschiede zwischen beforeFilter () und initialize ().
- initialize () wird immer aufgerufen, nachdem der Konstruktor aufgerufen wurde. beforeFilter () wird jedoch nicht aufgerufen, wenn die Aktionsmethode in einem bestimmten Controller nicht gefunden wird.
- Die initialize () -Methode wird im Allgemeinen für das Initialisieren verwendet, z. aber in beforeFilter () wird im Allgemeinen zum Ausführen eines globalen Logikteils verwendet.
Abrufen von Abfragezeichenfolgendaten, die $ _GET entsprechen
Sie können Abfrage-String-Daten als Array abrufen.
$post_data= $this->request->query;
Sie können die Postdaten für einen bestimmten Schlüssel abrufen.
$this->request->query['field'];
Bestimmten Schlüsselwert abrufen
$this->request->query('key_name');
Ruft einen bestimmten Schlüsselwert eines verschachtelten Arrays ab
$this->request->query('data.subfield');
Tabellen- (Modell-) Klasse erstellen
So erstellen Sie eine Benutzermodellklasse
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
}
Modellassoziationen in CakePHP
Es gibt 4 Arten von Assoziationen (Beziehungen), die wir in CakePHP definieren können
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');
}
}
Im obigen Beispiel sehen Sie 4 Arten von Beziehungen
Post gehört zu Author (One to One). author_id bedeutet, dass in der posts Tabelle ein Fremdschlüssel author_id ist, der der id der authors Tabelle zugeordnet ist.
Beitrag hat viele Tags (ein bis viele) , post_id in der tags Tabelle gibt es einen Fremdschlüssel post_id der der id der posts Tabelle zugeordnet ist.
Beitrag hat ein Tag (viele zu eins oder eins zu eins) . Dies bedeutet, dass in der posts ein Fremdschlüssel category_id ist, der mit der id der categories Tabelle verknüpft ist.
Beitrag hat und gehört zu Themen (viele bis viele) , dies ist eine Beziehung zwischen posts und topics . Für die Pflege vieler zu vieler Beziehungen muss die dritte Tabelle erstellt werden. Der Tabellenname sollte posts_categories . Felder dieser Tabelle wie unten erwähnt
- id (Primärschlüssel der Tabelle)
- post_id (Fremdschlüssel der
postsTabelle) - topic_id (Fremdschlüssel der
topics)