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.

  1. Przez zainicjowanie lub zastąpienie właściwości $ components w kontrolerze
  2. 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 ().

  1. inicjalizacja () jest zawsze wywoływana po wywołaniu konstruktora. ale beforeFilter () nie wywołuje się w przypadku braku metody działania w konkretnym kontrolerze.
  2. 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

  1. id (klucz podstawowy tabeli)
  2. post_id (klucz obcy tabeli posts )
  3. topic_id (klucz obcy tabeli topics )


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow