Поиск…


Создание нового контроллера

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
    }
}

Добавить метод beforeFilter () в контроллере

Метод beforeFilter () выполняется до того, как какой-либо другой метод выполняется в контроллере.

Сначала используйте пространство имен Event, прежде чем определять класс в вашем файле контроллера.

use Cake\Event\Event;

В контроллере добавьте метод beforeFilter (), как показано ниже.

public function beforeFilter(Event $event) {
    parent::beforeFilter($event);
}

Или вы можете использовать метод initialize() .

public function initialize(){
    parent::initialize();
}

Передача переменных в View

Передавать каждую переменную для просмотра одновременно

$this->set('color', 'pink');
$this->set('color', $color);

Передавать несколько переменных для просмотра вместе с помощью функции compact ()

$color1 = 'pink';
$color2 = 'red';
$this->set(compact('color1', 'color2'));

Получение почтовых данных, эквивалентных $ _POST

Вы можете получать данные для сообщений в виде массива.

$post_data= $this->request->data;

Вы можете получить данные о сообщении для определенного ключа.

$this->request->data['field'];

Получить определенное значение ключа

$this->request->data('key_name');

Получить определенное значение ключа вложенного массива

$this->request->data('data.subfield');

разница между нотами массива и методом data() заключается в том, что data() является безопасным с ошибкой и возвращает значение null если ключ не существует в массиве

так что

if(isset($this->request->data['field']) && $this->request->data['field']) { ...}

ты можешь сделать

if($this->request->data('field')) { ...}

для CakePHP 3.4.x +

получить все данные:

$this->request->getData();

получить конкретный ключ:

$this->request->getData('key');

для установки доступных данных для функции getData вам нужно сделать что-то вроде:

$this->request = $this->request->withData('some_key_on_the_fly', 'value');
$some_key_on_the_fly = $this->request->getData('some_key_on_the_fly');

полезно для обновления моделей в контроллере со статическими данными

Загрузите другую модель в контроллер

По умолчанию CakePHP загружает связанную модель в контроллер. Чтобы загрузить другую модель в контроллер, используйте метод loadModel ():

$this->loadModel('Articles');

или нагрузка на лету

$table = TableRegistry::get('Articles');
$table->find();

Перенаправление на другую страницу с контроллера

Перенаправление в приложение (другое действие конкретного контроллера).

return $this->redirect([
    'controller' => 'myController',
    'action' => 'myAction'
]);

Перенаправление на страницу реферера

return $this->redirect($this->referer());

Перенаправление на внешний вид приложения или конкретного URL-адреса

return $this->redirect("http://stackoverflow.com/users/1793428/haresh-vidja");

Передача переменной в действие из URL с перенаправлением

Передача переменной в URL как параметр метода

return $this->redirect([
    'controller' => 'users',
    'action' => 'profile',
    $id
]);

Url должен выглядеть так : http: // your_app_url / users / profile / {id}

в файле UsersController.php в режиме profile ()

class UsersController extends Controller {
    public function profile($id=null) {
        $userData=$this->Users->get($id);
    }
}

Передача переменной в URL как строка запроса

return $this->redirect([
    'controller' => 'users',
    'action' => 'profile',
    '?'=>['id'=>$id]
]);

Url должен выглядеть так : http: // your_app_url / users / profile /? Id = {id}

в файле UsersController.php в режиме profile ()

class UsersController extends Controller {
    public function profile() {
        $userData=$this->Users->get($this->request->query('id'));
    }
}

Установка или изменение макета приложения

Установите макет по умолчанию для всего приложения . т. е. созданный файл макета в /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
    }
}

Установите макет по умолчанию для конкретных действий в приложении . т.е. приложение имеет разный макет на странице входа в /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
    }
}

Изменить макет для конкретного контроллера . например, вам нужна разная компоновка для всего метода конкретного контроллера

class UsersController расширяет контроллер {

    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

Как правило, в запросе AJAX нет необходимости загружать CSS, JS. Также исключая другой код HTML.

Создайте файл ajax.ctp в / src / Template / Layout, а код должен быть

<?php 
    $this->fetch('content');

Установите макет на основе AJAX для всего приложения, в AppsController.php

класс AppsController расширяет 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
}

}

Загрузка компонентов в CakePHP

Мы можем загружать компоненты двумя способами.

  1. При инициализации или переопределении свойства $ components в контроллере
  2. Используя метод loadComponent () в методе initialize () контроллера.

Путь-1 Это должно быть переопределение загружаемого компонента приложением AppsController.php для загрузки одного или нескольких компонентов

class UsersController extends AppController {
    public $components = ['RequestHandler','Auth','Flash']; 
}

Way-2 Используйте этот способ, когда динамический компонент нагрузки требуется для конкретного контроллера. Загрузка одного компонента

class UsersController extends AppController {
    public function initialize() {
        parent::initialize();
        $this->loadComponent("RequestHandler"); // load specific component
        $this->loadComponent(["RequestHandler","Auth","Flash"]); // load specific component
    }
}

Что такое метод initilaize ()?

initialize () вводится в версии CakePHP> 3.0

Как структура кода, он выглядит так же, как и метод beforeFilter (). но существует много различий между beforeFilter () и initialize ().

  1. initialize () всегда вызывается после вызова конструктора. но beforeFilter () не вызывает в случае действия метода, не найденного в конкретном контроллере.
  2. Метод initialize () обычно используется для инициализации чего-то вроде добавления новых компонентов и помощников. но в beforeFilter () обычно используется для выполнения некоторой глобальной логической части.

Извлечь данные строки запроса, эквивалентные $ _GET

Вы можете получить данные строки запроса в виде массива.

$post_data= $this->request->query;

Вы можете получить данные о сообщении для определенного ключа.

$this->request->query['field'];

Получить определенное значение ключа

$this->request->query('key_name');

Получить определенное значение ключа вложенного массива

$this->request->query('data.subfield');

Создание класса таблицы (модели)

Как создать класс модели пользователя

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
}

Модельные ассоциации в CakePHP

Существует 4 типа ассоциаций (отношений), которые мы можем определить в 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');
    }
}

В приведенном выше примере вы можете видеть 4 типа отношений

Сообщение принадлежит автору (один к одному) , это означает, что в таблице posts есть один внешний ключ author_id который связан с id таблицы authors .

Post имеет много тегов (один для многих) , это означает, что в таблице tags есть один внешний ключ post_id который связан с id таблицы posts .

Сообщение имеет один тег (от нескольких до одного или один к одному) , это означает, что в таблице posts есть один внешний ключ category_id который связан с id таблицы categories .

Сообщение имеет и относится к темам (от многих до многих) , это много для многих отношений между posts и таблицей topics . для поддержания многих-многих отношений необходимо создать третью таблицу, таблицу, имя таблицы должно быть posts_categories . Поля этой таблицы, как указано ниже

  1. id (первичный ключ таблицы)
  2. post_id (внешний ключ таблицы posts )
  3. topic_id (внешний ключ таблицы topics )


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow