cakephp
Wskazówki dotyczące kodowania CakePHP3
Szukaj…
Tworzenie nowego kontrolera
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
}
}
Dodaj metodę beforeFilter () w sterowniku
Metoda beforeFilter () jest wykonywana przed wykonaniem jakiejkolwiek innej metody w kontrolerze.
Najpierw użyj przestrzeni nazw Zdarzenie przed zdefiniowaniem klasy w pliku kontrolera.
use Cake\Event\Event;
W kontrolerze dodaj metodę beforeFilter (), jak pokazano poniżej.
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
}
Lub Możesz użyć metody initialize() .
public function initialize(){
parent::initialize();
}
Przekazywanie zmiennych do widoku
Przekaż każdą zmienną, aby wyświetlić na raz
$this->set('color', 'pink');
$this->set('color', $color);
Przekaż wiele zmiennych, aby wyświetlić razem za pomocą funkcji compact ()
$color1 = 'pink';
$color2 = 'red';
$this->set(compact('color1', 'color2'));
Pobieranie danych posta odpowiadających $ _POST
Możesz pobrać dane postu jako Array.
$post_data= $this->request->data;
Możesz pobrać dane postu dla określonego klucza.
$this->request->data['field'];
Pobierz określoną wartość klucza
$this->request->data('key_name');
Pobierz określoną wartość klucza zagnieżdżonej tablicy
$this->request->data('data.subfield');
różnica między notacją tablicową a metodą data() polega na tym, że data() jest bezpieczna pod względem błędów i zwraca null jeśli klucz nie istnieje w tablicy
więc nie chcę tego robić
if(isset($this->request->data['field']) && $this->request->data['field']) { ...}
możesz to zrobić
if($this->request->data('field')) { ...}
dla CakePHP 3.4.x +
uzyskaj wszystkie dane:
$this->request->getData();
zdobądź określony klucz:
$this->request->getData('key');
aby ustawić dane dostępne dla funkcji getData, musisz zrobić coś takiego:
$this->request = $this->request->withData('some_key_on_the_fly', 'value');
$some_key_on_the_fly = $this->request->getData('some_key_on_the_fly');
przydatne do aktualizacji modeli w sterowniku danymi statycznymi
Załaduj inny model do kontrolera
Domyślnie CakePHP ładuje powiązany model do kontrolera. Aby załadować inny model do kontrolera, użyj metody loadModel ():
$this->loadModel('Articles');
lub ładuj w locie
$table = TableRegistry::get('Articles');
$table->find();
Przekierowanie do innej strony z kontrolera
Przekieruj do aplikacji (kolejne działanie określonego kontrolera).
return $this->redirect([
'controller' => 'myController',
'action' => 'myAction'
]);
Przekieruj na stronę polecającą
return $this->redirect($this->referer());
Przekieruj na zewnątrz aplikacji lub określonego adresu URL
return $this->redirect("http://stackoverflow.com/users/1793428/haresh-vidja");
Przekazywanie zmiennej do działania z adresu URL z przekierowaniem
Przekazywanie zmiennej w adresie URL jako parametr metody
return $this->redirect([
'controller' => 'users',
'action' => 'profile',
$id
]);
Adres URL powinien wyglądać tak : http: // twoja_nazwa_aplikacji / users / profile / {id}
w pliku UsersController.php w metodzie profile ()
class UsersController extends Controller {
public function profile($id=null) {
$userData=$this->Users->get($id);
}
}
Przekazywanie zmiennej w adresie URL jako ciąg zapytania
return $this->redirect([
'controller' => 'users',
'action' => 'profile',
'?'=>['id'=>$id]
]);
Adres URL powinien wyglądać tak : http: // twoja_nazwa_aplikacji / users / profile /? Id = {id}
w pliku UsersController.php w metodzie profile ()
class UsersController extends Controller {
public function profile() {
$userData=$this->Users->get($this->request->query('id'));
}
}
Ustaw lub zmień układ aplikacji
Ustaw domyślny układ dla całej aplikacji . tzn. utworzono plik układu w /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
}
}
Ustaw domyślny układ dla określonej akcji w aplikacji . tzn. aplikacja ma inny układ na stronie logowania w /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
}
}
Zmień układ dla określonego kontrolera . na przykład potrzebujesz innego układu dla każdej metody określonego kontrolera
klasa UsersController rozszerza kontroler {
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
}
}
Ustaw układ żądania Ajax
Ogólnie w żądaniu AJAX nie ma potrzeby ładowania CSS, JS. Pomijając także inny kod HTML.
Utwórz plik ajax.ctp w / src / Template / Layout, a kod powinien być
<?php
$this->fetch('content');
Ustaw układ oparty na AJAX dla całej aplikacji w AppsController.php
klasa AppsController rozszerza kontroler {
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
}
}
Załaduj komponenty do CakePHP
Możemy ładować komponenty na dwa sposoby.
- Przez zainicjowanie lub zastąpienie właściwości $ components w kontrolerze
- Za pomocą metody loadComponent () w metodzie initialize () kontrolera.
Sposób 1 Powinno to zastąpić ładowanie komponentu przez AppsController.php ładowanie jednego lub więcej składników
class UsersController extends AppController {
public $components = ['RequestHandler','Auth','Flash'];
}
Sposób 2 Użyj tego sposobu, gdy potrzebujesz dynamicznie ładować komponent dla konkretnego kontrolera. Załaduj jeden komponent
class UsersController extends AppController {
public function initialize() {
parent::initialize();
$this->loadComponent("RequestHandler"); // load specific component
$this->loadComponent(["RequestHandler","Auth","Flash"]); // load specific component
}
}
Co to jest metoda initilaize ()?
initialize () wprowadzono w wersji CakePHP> 3.0
Jako struktura kodu wygląda tak samo, jak metoda beforeFilter (). ale istnieje wiele różnic między beforeFilter () a initialize ().
- inicjalizacja () jest zawsze wywoływana po wywołaniu konstruktora. ale beforeFilter () nie wywołuje się w przypadku braku metody działania w konkretnym kontrolerze.
- Metoda initialize () jest zwykle używana do inicjalizacji czegoś takiego jak dodawanie nowych komponentów i pomocników. ale w beforeFilter () jest zwykle używany do wykonania jakiejś globalnej części logicznej.
Pobierz dane ciągu zapytania odpowiadające $ _GET
Możesz pobrać dane ciągu zapytania jako Array.
$post_data= $this->request->query;
Możesz pobrać dane postu dla określonego klucza.
$this->request->query['field'];
Pobierz określoną wartość klucza
$this->request->query('key_name');
Pobierz określoną wartość klucza zagnieżdżonej tablicy
$this->request->query('data.subfield');
Tworzenie klasy tabeli (modelu)
Jak utworzyć klasę modelu użytkownika
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
}
Powiązania modeli w CakePHP
Istnieją cztery typy powiązań (relacji), które możemy zdefiniować w 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');
}
}
W powyższym przykładzie widać 4 typy relacji
Post należy do autora (jeden do jednego) , co oznacza, że w tabeli posts znajduje się jeden klucz obcy author_id który jest powiązany z id tabeli authors .
Post ma wiele tagów (od jednego do wielu) , co oznacza, że w tabeli tags znajduje się jeden klucz obcy post_id który jest powiązany z id tabeli posts .
Post ma jeden znacznik (wiele do jednego lub jeden do jednego) , co oznacza, że w tabeli posts znajduje się jeden klucz obcy category_id który jest powiązany z id tabeli categories .
Post ma i należy do tematów (wiele do wielu) , jest to relacja wiele do wielu między posts a tabelą topics . Aby utrzymać relację wielu do wielu, trzeba utworzyć trzecią tabelę, tabelę, nazwę tabeli powinny mieć posts_categories . Pola tej tabeli, jak wspomniano poniżej
- id (klucz podstawowy tabeli)
- post_id (klucz obcy tabeli
posts) - topic_id (klucz obcy tabeli
topics)