cakephp
CakePHP3 coderingstips
Zoeken…
Nieuwe controller maken
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
}
}
Voeg de methode beforeFilter () toe in de controller
De methode beforeFilter () wordt uitgevoerd voordat een andere methode in de controller wordt uitgevoerd.
Gebruik eerst de Event-naamruimte voordat u de klasse definieert in uw controllerbestand.
use Cake\Event\Event;
Voeg in uw controller de methode beforeFilter () toe, zoals hieronder wordt weergegeven.
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
}
Of u kunt de methode initialize() gebruiken.
public function initialize(){
parent::initialize();
}
Variabelen doorgeven aan Beeld
Geef elke variabele door om tegelijkertijd te bekijken
$this->set('color', 'pink');
$this->set('color', $color);
Geef meerdere variabelen door om ze samen te bekijken via de functie compact ()
$color1 = 'pink';
$color2 = 'red';
$this->set(compact('color1', 'color2'));
Postgegevens ophalen gelijk aan $ _POST
U kunt postgegevens ophalen als Array.
$post_data= $this->request->data;
U kunt berichtgegevens voor een bepaalde sleutel ophalen.
$this->request->data['field'];
Specifieke sleutelwaarde ophalen
$this->request->data('key_name');
Specifieke sleutelwaarde van geneste array ophalen
$this->request->data('data.subfield');
het verschil tussen de matrixnotatie en de methode data() is dat data() foutveilig is en null retourneert als de sleutel niet in de array bestaat
dus in plaats van te doen
if(isset($this->request->data['field']) && $this->request->data['field']) { ...}
je kunt doen
if($this->request->data('field')) { ...}
voor CakePHP 3.4.x +
haal alle gegevens op:
$this->request->getData();
krijg specifieke sleutel:
$this->request->getData('key');
om gegevens beschikbaar te maken voor de getData-functie, moet je iets doen als:
$this->request = $this->request->withData('some_key_on_the_fly', 'value');
$some_key_on_the_fly = $this->request->getData('some_key_on_the_fly');
handig voor het bijwerken van de modellen in de controller met statische gegevens
Laad een ander model in de controller
Standaard laadt CakePHP het gerelateerde model in de controller. Gebruik de methode loadModel () om een ander model in de controller te laden:
$this->loadModel('Articles');
of laad meteen
$table = TableRegistry::get('Articles');
$table->find();
Omleiden van een andere pagina vanuit de controller
Omleiden naar binnen applicatie (een andere actie van een specifieke controller).
return $this->redirect([
'controller' => 'myController',
'action' => 'myAction'
]);
Omleiden naar verwijzende pagina
return $this->redirect($this->referer());
Omleiden naar buiten applicatie of specifieke URL
return $this->redirect("http://stackoverflow.com/users/1793428/haresh-vidja");
Variabele naar actie doorgeven van URL met omleiding
Variabele in URL doorgeven als parameter van een methode
return $this->redirect([
'controller' => 'users',
'action' => 'profile',
$id
]);
URL moet er als volgt uitzien : http: // your_app_url / users / profile / {id}
in het bestand UsersController.php in de methode profile ()
class UsersController extends Controller {
public function profile($id=null) {
$userData=$this->Users->get($id);
}
}
Variabele in URL doorgeven als een queryreeks
return $this->redirect([
'controller' => 'users',
'action' => 'profile',
'?'=>['id'=>$id]
]);
URL moet er als volgt uitzien : http: // your_app_url / users / profile /? Id = {id}
in het bestand UsersController.php in de methode profile ()
class UsersController extends Controller {
public function profile() {
$userData=$this->Users->get($this->request->query('id'));
}
}
Lay-out of toepassing instellen of wijzigen
Stel de standaardindeling in voor de hele applicatie . dat wil zeggen, een lay-outbestand gemaakt 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
}
}
Stel de standaardindeling in voor specifieke actie in de toepassing . dat wil zeggen, de toepassing heeft een andere lay-out op de inlogpagina 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
}
}
Wijzig de lay-out voor een specifieke controller . want dat wil zeggen, u hebt een andere lay-out nodig voor alle methoden van een specifieke controller
class UsersController breidt Controller {uit
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
}
}
Ajax-aanvraagindeling instellen
Over het algemeen in AJAX-aanvraag geen behoefte aan CSS, JS laden. Ook andere HTML-code weglaten.
Maak een ajax.ctp-bestand in / src / Template / Layout en de code zou dat moeten zijn
<?php
$this->fetch('content');
Stel op AJAX gebaseerde lay-out in voor de hele applicatie, in AppsController.php
class AppsController breidt Controller {uit
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
}
}
Componenten laden in CakePHP
We kunnen componenten op twee manieren laden.
- Door de $ componenten-eigenschap in Controller te initialiseren of te negeren
- Door de methode loadComponent () te gebruiken in de methode initialize () van de controller.
Manier-1 Het zou het laden van componenten door AppsController moeten overschrijven. Laad een of meer componenten
class UsersController extends AppController {
public $components = ['RequestHandler','Auth','Flash'];
}
Manier-2 Gebruik deze manier wanneer u dynamisch een component voor een specifieke controller nodig hebt. Laad één component
class UsersController extends AppController {
public function initialize() {
parent::initialize();
$this->loadComponent("RequestHandler"); // load specific component
$this->loadComponent(["RequestHandler","Auth","Flash"]); // load specific component
}
}
Wat is de methode initilaize ()?
initialize () wordt geïntroduceerd in CakePHP versie> 3.0
Als een codestructuur ziet deze er hetzelfde uit als de methode beforeFilter (). maar er zijn veel verschillen tussen beforeFilter () en initialize ().
- initialize () wordt altijd aangeroepen nadat de constructor wordt aangeroepen. maar beforeFilter () roept niet op als de actiemethode niet wordt gevonden in een bepaalde controller.
- initialize () methode wordt meestal gebruikt voor het initialiseren van iets zoals nieuwe componenten en helpers toevoegen. maar in beforeFilter () wordt meestal gebruikt om een globaal logisch onderdeel uit te voeren.
Haal gegevens van de queryreeks op die equivalent zijn aan $ _GET
U kunt querystringgegevens ophalen als array.
$post_data= $this->request->query;
U kunt berichtgegevens voor een bepaalde sleutel ophalen.
$this->request->query['field'];
Specifieke sleutelwaarde ophalen
$this->request->query('key_name');
Specifieke sleutelwaarde van geneste array ophalen
$this->request->query('data.subfield');
Tabelklasse (model) maken
Hoe een User Model Class te maken
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
}
Modelverenigingen in CakePHP
Er zijn 4 soorten associaties (relaties) die we kunnen definiëren 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');
}
}
In het bovenstaande voorbeeld ziet u 4 soorten relaties
Bericht is van Auteur (één op één) , dit betekent dat in de posts tabel één buitenlandse sleutel author_id die is gekoppeld aan de id van de authors tabel.
Post heeft veel Tags (One to Many), betekent dit dat in tags tafel heeft een vreemde sleutel post_id die wordt geassocieerd met id van posts tafel.
Bericht heeft één tags (veel naar één of één naar één) , dit betekent dat in de posts één externe sleutel category_id die is gekoppeld aan de tabel met de id van de categories .
Bericht heeft en behoort tot Onderwerpen (Veel tot veel) , dit is een veel-te-veel-relatie tussen posts en een topics . voor het onderhouden van veel tot veel relaties moet het nodig zijn om een derde tabel te maken, tabel, tabelnaam moet posts_categories . Velden van deze tabel zoals hieronder vermeld
- id (primaire sleutel van de tabel)
- post_id (externe sleutel van
posts) - topic_id (externe sleutel van
topicstabel)