cakephp
CakePHP3 kodningstips
Sök…
Skapa ny kontroller
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
}
}
Lägg till föreFilter () -metoden i Controller
Metoden föreFilter () körs innan någon annan metod körs i styrenheten.
Använd först händelsens namnutrymme innan du definierar klassen i din kontrollfil.
use Cake\Event\Event;
Lägg till metoden beforeFilter () i din styrenhet som visas nedan.
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
}
Du kan också använda initialize() .
public function initialize(){
parent::initialize();
}
Vidarebefordra variabler till Visa
Passera varje variabel för att visa åt gången
$this->set('color', 'pink');
$this->set('color', $color);
Passera flera variabler för att visa tillsammans via kompakt () -funktion
$color1 = 'pink';
$color2 = 'red';
$this->set(compact('color1', 'color2'));
Hämtar inläggsdata motsvarande $ _POST
Du kan hämta inläggsdata som Array.
$post_data= $this->request->data;
Du kan hämta inläggsdata för en viss nyckel.
$this->request->data['field'];
Hämta specifikt nyckelvärde
$this->request->data('key_name');
Hämta specifikt nyckelvärde för kapslad matris
$this->request->data('data.subfield');
skillnaden mellan arraynotation och data() -metoden är att data() är felsäker och returnerar null om nyckeln inte finns i arrayen
så intead att göra
if(isset($this->request->data['field']) && $this->request->data['field']) { ...}
du kan göra
if($this->request->data('field')) { ...}
för CakePHP 3.4.x +
få all information:
$this->request->getData();
få en specifik nyckel:
$this->request->getData('key');
För att ställa in tillgängliga data för getData-funktionen måste du göra något som:
$this->request = $this->request->withData('some_key_on_the_fly', 'value');
$some_key_on_the_fly = $this->request->getData('some_key_on_the_fly');
användbart för att uppdatera modellerna i controller med statisk data
Ladda en annan modell i Controller
Som standard laddar CakePHP den relaterade modellen i regulatorn. För att ladda en annan modell i regulatorn använder du metoden loadModel ():
$this->loadModel('Articles');
eller ladda på flugan
$table = TableRegistry::get('Articles');
$table->find();
Omdirigerar till en annan sida från Controller
Omdirigera till inom applikationen (en annan åtgärd från en specifik controller).
return $this->redirect([
'controller' => 'myController',
'action' => 'myAction'
]);
Omdirigera till referenssidan
return $this->redirect($this->referer());
Omdirigera till utanför applikationen eller specifik URL
return $this->redirect("http://stackoverflow.com/users/1793428/haresh-vidja");
Vidarebefordra variabel till åtgärd från URL med omdirigering
Skickar variabel i URL som metodens parameter
return $this->redirect([
'controller' => 'users',
'action' => 'profile',
$id
]);
Url bör se ut så här http: // din_app_url / användare / profil / {id}
i metoden UsersController.php i fil ()
class UsersController extends Controller {
public function profile($id=null) {
$userData=$this->Users->get($id);
}
}
Passar variabel i URL som en frågesträng
return $this->redirect([
'controller' => 'users',
'action' => 'profile',
'?'=>['id'=>$id]
]);
Url ska se ut så här http: // din_app_url / användare / profil /? Id = {id}
i metoden UsersController.php i fil ()
class UsersController extends Controller {
public function profile() {
$userData=$this->Users->get($this->request->query('id'));
}
}
Ställ in eller ändra applikationslayout
Ställ in standardlayout för hela applikationen . dvs. skapad layoutfil i /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
}
}
Ställ in standardlayout för specifik åtgärd i applikationen . dvs. applikationer har olika layout på inloggningssidan i /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
}
}
Ändra layout för specifik styrenhet . för dvs. du behöver olika layout för alla metoder för specifik styrenhet
klass UsersController utökar 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
}
}
Ställ in Ajax Request Layout
Generellt i AJAX begäran inget behov av last CSS, JS. Utelämnar också annan HTML-kod.
Skapa ajax.ctp-fil i / src / Mall / Layout, och koden ska vara
<?php
$this->fetch('content');
Ställ in AJAX-baserad layout för hela applikationen i AppsController.php
klass AppsController utökar 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
}
}
Ladda komponenter i CakePHP
Vi kan ladda komponenter på två sätt.
- Genom att initialisera eller åsidosätta egenskapen $ komponenter i Controller
- Genom att använda loadComponent () -metoden i initiera () -metoden för Controller.
Way-1 Det bör åsidosättas laddningskomponent genom att AppsController.php laddar en eller flera komponenter
class UsersController extends AppController {
public $components = ['RequestHandler','Auth','Flash'];
}
Way-2 Använd detta sätt när du behöver lastkomponenter dynamiskt för en specifik styrenhet. Ladda en komponent
class UsersController extends AppController {
public function initialize() {
parent::initialize();
$this->loadComponent("RequestHandler"); // load specific component
$this->loadComponent(["RequestHandler","Auth","Flash"]); // load specific component
}
}
Vad är initilaize () -metoden?
initialisera () introduceras i CakePHP-version> 3.0
Som kodstruktur ser det ut som för metoden BeforeFilter (). men det finns många skillnader mellan beforeFilter () och initialisera ().
- initialisera () kallas alltid efter att konstruktör har kallats. men innanFilter () ringer inte i fall av åtgärdsmetod som inte finns i en viss styrenhet.
- initialisera () -metoden används vanligtvis för att initialisera något som att lägga till nya komponenter och hjälpare. men i beforeFilter () används vanligtvis för att utföra någon global logisk del.
Återskapa data från frågesträngen motsvarande $ _GET
Du kan hämta frågesträngningsdata som Array.
$post_data= $this->request->query;
Du kan hämta inläggsdata för en viss nyckel.
$this->request->query['field'];
Hämta specifikt nyckelvärde
$this->request->query('key_name');
Hämta specifikt nyckelvärde för kapslad matris
$this->request->query('data.subfield');
Skapa tabell (modell) klass
Hur man skapar användarmodellklass
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
}
Modellföreningar i CakePHP
Det finns fyra typer av föreningar (relationer) som vi kan definiera i 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');
}
}
I exemplet ovan kan du se fyra typer av relationer
Inlägg tillhör författare (En till en) , det betyder att i posts har en utländsk nyckel author_id som är associerad med id för authors .
Inlägget har många taggar (en till många) , det betyder att i tags har en utländsk nyckel post_id som är associerad med id för posts .
Inlägget har en taggar (Många till en eller en till en) , det betyder att i posts har en utländsk nyckel category_id som är associerad med id för categories .
Inlägget har och tillhör ämnen (många till många) , detta är många till många förhållanden mellan posts och topics . För att upprätthålla många till många förhållanden måste behöva skapa tredje tabell, tabell, posts_categories bör vara posts_categories . Fält i denna tabell som nämns nedan
- id (primär nyckel i tabellen)
- post_id (utländsk nyckel för
posts) - topic_id (utländsk nyckel till
topics)