cakephp
Советы по кодированию CakePHP3
Поиск…
Создание нового контроллера
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
Мы можем загружать компоненты двумя способами.
- При инициализации или переопределении свойства $ components в контроллере
- Используя метод 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 ().
- initialize () всегда вызывается после вызова конструктора. но beforeFilter () не вызывает в случае действия метода, не найденного в конкретном контроллере.
- Метод 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 . Поля этой таблицы, как указано ниже
- id (первичный ключ таблицы)
- post_id (внешний ключ таблицы
posts) - topic_id (внешний ключ таблицы
topics)