CakePHP с нуля генератор Bake строит приложения с отношениями в таблицах


Содержание

Создание таблиц и соответствующих моделей с использованием cakePHP

Мое приложение позволяет пользователям (администраторам) создавать свои собственные формы, и каждая форма будет иметь соответствующую таблицу для хранения этой информации. Поэтому всякий раз, когда создается форма, мне нужно будет создать таблицу в базе данных для этой формы на основе ее типа ввода и возможного значения.

Создание таблицы может быть выполнено с помощью метода $this->Model->query(‘create table . ‘) , но одна вещь, которую я не могу понять, — как я могу потом создать модель для соответствующей таблицы?

Любая помощь в этом отношении будет оценена по достоинству.

Вы не должны создавать самомодифицирующееся приложение. Это скоро станет головной болью, если только с оптимистической точки зрения. Динамическое динамическое изменение базы данных — это динамическое создание моделей. Не делайте этого.

Если ваша цель — создать приложение, которое позволяет пользователям создавать формы, вам нужно будет создать мета-приложение, которое хранит информацию о формах и схемах как данные в базе данных.

На основе этой метаинформации вам необходимо динамически создавать фактические формы и сохранять входные данные в подобной метамоде в вашей базе данных.

Если вы не пытаетесь создать клон базы данных базы данных phpMyAdmin, это единственный реалистичный способ. Если вы пытаетесь создать приложение для администрирования базы данных, вы не будете создавать модели динамически, а просто используйте одну модель манипуляции с базой данных, которая будет делать почти все через $this->query() .

В любом случае вы создаете мета-приложение, которое часто бывает плохой идеей. Вы пытаетесь предоставить работу программистов (проектирование и создание баз данных и форм) для пользователей, что неизбежно приведет к худшей работе. Это, конечно, только мое скромное мнение, я не знаю вашего дела.

CakePHP: создаем сайт для закладок.

В статье рассказывается как с помощью фреймворка CakePHP создавать быстрые и легкие приложения, затрачивая при этом минимум времени и сил. На примере создания сайта для закладок, практически показаны методы и приемы работы с контроллерами, методами и представлениями CakePHP.

Если вы эксперт в CakePHP, вы знаете, как находить контроллеры, углубляться в модели и создавать представления, впечатляющие публику. Но, войдя во вкус быстрой разработки приложений с CakePHP, вы хотите сделать еще, причем больше за меньшее время. Что ж, имеете право: и мы посмотрим, как расширить функционал нашего приложения с помощью модулей CakePHP. Это следствие принципа DRY (Don’t repeat yourself — Не повторяй себя). Найдя решение проблемы однажды, разумным образом оформите его и поделитесь им со всем миром, чтобы каждый мог что-то вложить и что-то получить от этого решения. А для этого прихватите немного кода, уже написанного другими, и воспользуйтесь модулями расширения, чтобы сэкономить массу времени.

Рискнем создать сайт для хранения закладок, где будут храниться не только адреса с их описанием, но и симпатичные миниатюры. Так как мы живем в эпоху социальных сетей, добавим возможность быстрого и удобного размещения закладок в социальных сетях, чтобы друзья и знакомые узнали о них.

Как всегда, потратим немного времени на то, чтобы убедиться, что наша база данных соответствует соглашениям и стандартам CakePHP, чтобы каркас сделал за нас всю трудную работу. Желающим отклониться от предложенных стандартов и структур советую заглянуть на страничку http://book.cakephp.org/view/901/cakephp-conventions — там можно получить информацию о том, как уйти в свободное плавание собственным путем.
Немного поразмыслим над данными, которые нам нужно будет хранить. Нам понадобятся URL, пользователи, рейтинги, чтобы при размещении адресов закладок в Twitter, Facebook или любой другой социальной сети пользователи смогли оценить содержимое, если оно им нравится.
CREATE DATABASE `bookmark`;
USE `bookmark`;
CREATE TABLE `urls` (
`id` CHAR(36) NOT NULL PRIMARY KEY,
`user_id` CHAR(36) NOT NULL,
`name` VARCHAR(128) NOT NULL,
`url` TEXT,
`created` DATETIME,
`modified` DATETIME
);
CREATE TABLE `users` (
`id` CHAR(36) NOT NULL PRIMARY KEY,
`username` VARCHAR(45) NOT NULL,
`password` VARCHAR(255) NOT NULL,
`email` VARCHAR(255) NOT NULL,
`created` DATETIME,
`modified` DATETIME
);

Минуточку, но ведь это, конечно, не все таблицы, которые нам нужны? Список параметров, которые мы хотели хранить для каждой вкладки, был довольно длинным. И непохоже, что в этой таблице хватает полей на все данные — если не считать того момента, что каждый модуль расширения может хранить необходимую информацию из базы данных самостоятельно, чтобы гарантировать, что в пакете модуля содержится весь предоставляемый функционал, включая требования базы по хранению данных.
Ну и как это работает? Для этого необходимо воспользоваться либо оболочкой «Schema», поставляемой с CakePHP, либо модулем расширения «Migrations». Мы воспользуемся модулем миграции.
Bake — консольная команда, с помощью которой можно генерировать код, выполнять миграции, запускать тесты и многое другое. Для удобства работы с ней из консоли, путь cake/console внутри пакета CakePHP нужно включить в переменную окружения PATH. Сделать это можно так:
$export PATH=»$PATH:/path/to/cakephp/cake/console»
Единственное оставшееся требование — РНР должен быть доступен в командной строке. Во многих дистрибутивах есть пакет php-cli или подобный ему, в котором есть исполняемый файл РНР для командной строки.
Начнем новый проект и создадим базовую структуру, от которой и будем отталкиваться. Выполняем следующие команды:
$cake bake project bookmark
$cd bookmark
CakePHP создал базовую структуру приложения. Она содержит каталоги и ряд исходных файлов для обслуживания статических страниц. Покопайтесь в ней, присмотритесь, чем именно вас снабдили.
Прежде чем заняться выпеканием, нужно дать понять CakePHP, как подключится к нашей базе данных. Скопируйте файл /config/database.php.default в /config/datаbase.php. Введите туда настройки своей базы данных, имя пользователя и пароль для базы данных. Вот, примерно, что у вас должно получиться:
`mysql`,
`persistent` => false,
`host` => `localhost`,
`login` => `login`,
`password` => `password`,
`database` => `bookmark`,
`prefix` => «,
);
>
Заметьте, что настройки базы test из этого файла удалены. Тестовая конфигурация используется при модульном тестировании, а мы в рамках нашего проекта этим заниматься не будем.
Давайте приступим к созданию моделей, представлений и контроллеров для таблиц базы данных, которые мы создали ранее. С помощью команд создадим весь код, необходимый для работы приложения в целом, потом нам останется только его модифицировать.
$cake bake all user
$cake bake all url
Пусть вас не пугает объем вывода команды bake, чем больше данных она выводит, тем больше времени мы сэкономим на написании кода. Взглянув на вывод, вы увидите все пути и имена файлов, которые были созданы для нас. Теперь у нас есть пользователь и система управления ссылками, и вы можете заходить на сайт, чтобы добавлять или изменять какую-либо информацию. Попробуйте открыть ссылку /users. У меня каталог находится в корне веб-сервера и адрес будет таким: http://localhost/bookmark/users. Откроется страница со списком пользователей, где вы сможете найти ссылки для добавления пользователей и изменения информации о них.
Быстренько пробежимся по тому, как закрыть сайт от доступа посторонних, чтобы мы смогли создавать пользователей и входить в систему, но без входа в систему доступ ко всему был бы закрыт.
Откройте файл app_controller.php в корне проекта. Это пустой контроллер, от которого наследуют свой функционал все остальные контроллеры приложения. Все сделанное в нем будет доступно во всех остальных контроллерах, так что это прекрасное место для аутентификации, которая заставит пользователей входить на сайт и помешает незваным гостям изменять данные. Добавьте компоненты «Auth» и «Session». Теперь ваш контроллер AppController длжен выглядеть так:
set(‘authUser’,$this->Auth->user());
return parent::beforeFilter;
>
>
Как видите, мы изменили вызов set в функции beforeFilter. Это гарантирует нам доступ к информации о текущем пользователе во всех представлениях сайта. Если текущего пользователя нет, this установится в null.
Затем откройте /controllers/users_controller.php и добавьте действие login. Оно может быть пустым: о его содержании позаботиться CakePHP. Пока мы тут, давайте добавим еще и logout, чтобы дать возможность пользователям выходить из системы:
function login() <
>
function logout() <
return $this->redirect($this->Auth->logout());
>
Наконец, в контроллере нужно гарантировать, что для создания пользователя не придется входить в систему, иначе система заблокируется, так как в ней не пользователей. Добавляем следующий метод в контроллер users:
function beforeFilter() <
$this->Auth->allow(‘add’);
return parent::beforeFilter();
>
Последний фрагмент этой мозайки — файл представления view, который был создан утилитой bake. Он примет имя пользователя и пароль и позволит пользователям войти в систему. Создайте представление login в новом файле: /views/users/login.ctp:

Снова откройте список пользователей users, и вы незамедлительно будете перенаправлены на форму авторизации. Теперь попробуйте зайти на страницу добавления пользователя, и вы увидите, что ее можно просматривать без ввода логина и пароля.
Пора выпить чашку чаю/кофе, кому что нравиться — сайт работает, данные мы защитили. Пробегитесь по приложению и создайте нового пользователя. Зайдите на сайт под этим пользователем и проверьте, что все работает правильно, добавьте пару ссылок. Теперь, когда сайт вам знаком и вы довольны его работой, пора подключить несколько модулей и заставить работать некоторые примочки.
Давайте отыщем необходимые модули, загрузим их и настроим каталоги в /app/plugins. Для загрузки модулей воспользуемся Git. С помощью Git модули грузятся быстрее. Вдобавок, это прекрасная возможность научится работать с Git как со средством управления версиями:
git clone https://github.com/cakedc/migration.git plugins/migrations
git clone https://github.com/cakedc/ratings.git plugins/rating
git clone https://cakedc/search.git plugins/search
git clonr https://github.com/predominant/cake_social.git plugins/cake_social
git clonr https://github.com/predominant/goodies.git plugins/goodies
Только что мы сэкономили несколько месяцев на разработке. Я не шучу. Мы воспользовались набором модулей с открытым исходным кодом, которые доступны любому разработчику.
Ранее говорилось, что нам не хватает таблиц в базе данных, и мы позаботимся об этом с помощью миграции баз данных. Сейчас вы увидите, как просто создать таблицу базы данных для модулей и повторного использования кода в проектах. Не всем модулям нужна миграция, и не все модули ее предусматривают. У тех, у кого она есть, в каталоге config есть подкаталог migrations. Например, вы можете пройтись по модулям и посмотреть, кому из них нужна миграция, или просто запустить ее для всех: тогда для модулей, которым она не нужна, появится сообщение об ошибке — тут-то они нам и попадутся.
Выполните следующую команду, чтобы завершить настройку таблиц для добавленных модулей:
$cake migration -plugin ratings all
Теперь у вас есть все необходимые таблицы.
Для начала обеспечим возможность выставления рейтинга. Рейтинг должен быть только у URL-адресов. Добавить компонент очень просто: открываем UrlsController в файле /controllers/urls_controller.php и добавьте компонент Ratings:
class UrlsController extends AppController <
var $components=array(‘Ratings.Ratings’);
//.. existing code
>
Свежедобавленный компонент сам подключается вспомогательный класс, необходимый для отображения формы с рейтингом, а также обрабатывает сохранение и загрузку информации о рейтингах. Поэтому все, что нужно — это задать представление для отображения формы с рейтингами с помощью вспомогательного класса рейтингов.
Страница просмотра адреса смотрится довольно пресно. Нужно как минимум добавить немного графики и элементов управления, чтобы посетители быстрее воспринимали информацию. Оставим сложности CSS и стилизации веб-мастерам, но немного упростим им задачу, показав иконки пользователя из информации о пользователя для каждого адреса. Для этого будем использовать вспомогательный класс gravatar плагина Goodies.
Откройте представление для адресов. Мы заменим строку:
Html->link($url[‘User’][‘id’], array(‘controller’ => ‘users’, ‘action’ => ‘view’,$url[‘User’][‘id’]));?>
на похожую, но включающую в себя вывод аватара с помощью вспомогательного класса:
Html->link(
$this->Gravatar->image($url[‘User’][’email’]),
array(‘controller’ => ‘users’, ‘action’ => ‘view’,
$url[‘User’][‘id’]),
array(‘escape’ => false));?>

Наконец, подключите вспомогательный класс в контроллере AppController в файле /app_controller.php:
class AppController extends Controller <
var $helpers=array(‘Html’,’Form’,’Sessions’,’Goodies.Gravatar’);
//.. existing code
>
Теперь будет отображаться граватар пользователя, полученный по его e-mail, указанному во время регистрации, а вместо уродливого UUID будет показано имя пользователя.
Давайте еще немного украсим дополнительную информацию, добавив возможность поделиться ссылкой в социальных сетях, чтобы привлечь больше посетителей на сайт. Этот функционал предоставляет модуль CakeSocial. В модуле есть вспомогательный класс «ShareThis», который очень сильно упрощает обмен контентом в социальных сетях. Добавляем вспомогательный класс в контроллер AppController в файле /app_controller.php:
class AppController extends Controller <
var $helpers=array(‘Html’,’Form’,’Sessions’,’Goodies.Gravatar’,’CakeSocial.ShareThis’);
//,,existing code
>
С разу перед закрывающим тегом в представлении для адресов /view/urls/view.php вставьте следующий код:
>
>
ShareThis->display();?>

В этом представлении пять строк, но только одна выводит ссылки на социальные сети. Остальное — метка и стили для обертки вывода. Обновите страницу и увидите, что ссылки на социальные сети ShareThis появились, и можно поделиться ссылкой в списке сервисов по умолчанию.
Приложение, которое у нас получилось, показывает, как быстро можно создавать код с CakePHP, и иллюстрирует качество свободных модулей. У приложение есть большой потенциал для расширения — предоставление дополнительной информации, например, частых URL-адресов, интеграция в сервис REST, Ajax-скриплет для работы с закладками, который можно встроить в браузер. Возможности CakePHP по истине безграничны!

Печём пирожки или начало работы с CakePHP по-русски

Скоро товарищей, пишущих по старинке веб-страницы на голом php, можно будет показывать в зоопарках :) Наступает эра Фреймворков. И это хорошо, потому что программист избавлен от множества рутинных задач, и может сосредоточиться на создании логики приложения. В CakePHP используется подход MCV (Model — View — Controller). Теперь вместо одного файла *.php на одну страничку их будет целых три минимум %) — один для модели (описывает связь формы с базой данных, имеет расширение php), thtml файл будет описывать внешний вид страницы (view), третий (контроллер страницы с расширением php будет реализовывать логику формы и будет содержать методы, дополняющие функциональность родительского класса AppController.

Что ж, начнем печь приложения как пирожки :)) Но для этого придется преступить через себя и принять новый подход к программированию. Оно того стоит ^_^

Установка

Вам нужен Apache с установленным mod_rewrite и mod_php, php4 или php5, а также база данных (в нашем примере используется MySQL). Первым делом разживитесь на www.cakephp.org свежей версией CakePHP. Там же расположен неплохой мануал, которому я во многом буду следовать. Распакуйте архив в корневую директорию веб-сервера и наберите в браузере адрес сайта. Должна появиться приветственная страничка: Your database configuration file is not present.

Нужно прописать соединение с базой данных. Делается это в директории app/config — берем за основу database.php.default и переименовываем его в database.php. Прописываем в файле параметры соединения с базой. Если все ОК то CakePHP сообщит об этом. Your database configuration file is present. Cake is able to connect to the database.

Все готово для творчества.

Модуль новостей

Напишем простейший модуль новостей, чтобы проиллюстрировать технологию создания сайтов на Фреймворке. Создадим в базе данных таблицу posts, в которой будут храниться новости.CREATE TABLE `posts` ( `id` bigint(20) NOT NULL auto_increment, `post_date` date NOT NULL default ‘0000-00-00’, `post_header` varchar(255) NOT NULL default », `post_text` text NOT NULL, `archived` tinyint(4) NOT NULL default ‘0’, PRIMARY KEY (`id`) )

Вопрос: почему бы таблицу не назвать «news»? Таблица должна иметь имя сущности во множественном числе. В английском «новости» news всегда употребляется во множественном числе, тем более слово new является ключевым в php, что приводит к ошибке.

Модель

В папке app/models создадим файл модели post.php VALID_NOT_EMPTY, ‘post_text’ => VALID_NOT_EMPTY, ‘post_date’ => VALID_NOT_EMPTY ); > ?>

В массиве $validate описываются ограничения накладываемые логикой приложения на данные. Мы запретили пустые поля Текст, Заголовок и Дата.

Контроллер

В папке app/controllers создадим файл posts_controller.php. Создадим объект, который реализует основные функции модуля новостей: отображение списка (index), просмотр новости (view), удаление новости (delete), добавления новости (add).set(‘posts’, $this->Post->findAll()); // выборка всех
записей //из таблицы $this->pageTitle = ‘Новости’; > function view($id) // просмотр новости < $this->Post-> >set(‘post’, $this->Post->read()); > function add() // добавление новости < if (!empty($this->data)) < if ($this->Post->save($this->data)) < $this->flash(‘Новость была успешно добавлена’,’/posts’); // flash выдает сообщение пользователю в виде ссылки на страницу, указанной во втором аргументе функции > > > function delete($id) // удаление новости < $this->Post->del($id); $this->flash(‘Новость была удалена’, ‘/posts’); > function edit($ >data)) < $this->Post-> >data = $this->Post->read(); > else < if ($this->Post->save($this->data[‘Post’])) < $this->flash(‘Новость была отредактирована’,’/posts’); > > > > ?>

В папке app/views создадим папку posts. В этой папке необходимо создать файлы видов для каждой функции, кроме функции Delete, которая не требует своего вида, а использует только функцию flash.

app/views/posts/index.thtmlНовости >’; if (count($posts)>0) < ?>

Дата Заголовок Текст
= $news_teaser_length) < $last_word = $mes_words[$news_teaser_length -1]; for ($i = 0; $i link($text.$news_more_annex, '/posts/view/'.$post['Post']['id']); >else < echo $html->link($post[‘Post’][‘post_text’], ‘/posts/view/’.$post[‘Post’][‘id’]); > ?> link(‘Редактировать’, ‘/posts/edit/’.$post[‘Post’][‘id’]); ?> link(‘Удалить’, ‘/posts/delete/’.$post[‘Post’][‘id’]); ?>

Новостей пока нет»; > ?>

Название:
input(‘Post/post_header’, array(‘size’ => ’40’))?> tagErrorMsg(‘Post/post_header’, ‘Название не может быть пустым.’) ?>

Дата:
input(‘Post/post_date’, array(‘size’ => ’40’))?> tagErrorMsg(‘Post/post_data’, ‘Дата не может быть пустой.’) ?>

Текст:
textarea(‘Post/post_text’, array(‘rows’=>’10’)) ?> tagErrorMsg(‘Post/post_text’, ‘Сообщение не может быть пустым.’) ?>

app/views/posts/edit.thtmlРедактирование новости hidden(‘Post/id’); ?>

Заголовок:
input(‘Post/post_header’, array(‘size’ => ’40’))?> tagErrorMsg(‘Post/post_header’, ‘Необходим заголовок.’) ?>

Дата:
input(‘Post/post_date’, array(‘size’ => ’40’))?> tagErrorMsg(‘Post/post_date’, ‘Необходима дата.’) ?>

Текст:
textarea(‘Post/post_text’, array(‘rows’=>’10’)) ?> tagErrorMsg(‘Post/post_text’, ‘Текст не должен быть пустым!’) ?>

Фу: вроде все почти готово :) Теперь осталось перенаправить пользователя c приветственной странички CakePHP на страничку app/posts.

Цукерберг рекомендует:  Эффект окрашивания в серый цвет изображений при наведении курсора посредством CSS и jQuery

Для этого идем в app/config/routes.php и меняем там строку$Route->connect(’/’, array(’controller’ =>
‘pages’, ‘action’ => ‘display’, ‘home’));

на строку$Route->connect (’/’, array(’controller’=>’posts’, ‘action’=>’index’));

Теперь можете в браузере набрать адрес сайта и понаблюдать CakePHP в действии :)

Небольшая обработка напильником

Полюбовавшись на полученное приложение, пытливый читатель скоро почувствует разочарование. Как поменять стиль страницы, убрать маленький баннер снизу и гордое «CakePHP Rapid Development» в верху каждой страницы? Как заставить функцию flash отображать текст по-русски? Для этой цели служат layouts. (Долго думал, как перевести layouts и решил остановиться на слове «шаблоны»). Бодро идем в папку app/views/layouts и помещаем там нужные файлы:

default.thtml, например, такой:

Вылечим функцию flash от любви к utf8. Для этого разместим там же flash.thtml

Прототипы этих файлов можно увидеть в папке cake/libs/view/templates/layouts

Видеокурс «Фреймворк CakePHP: с Нуля до Гуру на примере создания корпоративного сайта». (Андрей Кудлай — Webformyself)

Автор(ы): Андрей Кудлай

Первый и единственный в Рунете исчерпывающий видеокурс на тему работы с фреймворком CakePHP… Уже в ближайшие 2 месяца вы из полного новичка веб-программирования превратитесь в профессионала, которому по зубам будут даже очень сложные и дорогие веб-проекты… Если вы будете посвящать всего лишь 2-3 часа в день изучению материалов курса, то уже менее чем через 60 дней вы уверенно сможете создавать сайты любой сложности, используя фреймворк CakePHP. Вы создадите свою первую страничку вашего будущего сайта уже во время прохождения первых занятий курса. Если у вас не получится либо вы решите, что этот курс вам не подходит, то я верну вам все потраченные деньги обратно!

Смотреть видео:

Фреймворк CakePHP: с Нуля до Гуру на примере создания корпоративного сайта. (Андрей Кудлай — Webformyself)

  • Часть 1. Фреймворк CakePHP. Изучаем теорию и возможности фреймворка

Первая часть курса будет посвящена изучению возможностей, которые предлагает нам фреймворк CakePHP. Здесь мы лишь прикоснемся к его огромным возможностям и попробуем применить их на практике при создании простейшего блога. В процессе изучения теории, мы будем также учиться работать с документацией. Как уже отмечалось, актуальной русскоязычной документации – просто нет. Однако официальная документация на английском языке довольно хороша, и уметь ею пользоваться – это практически обязательное требование при работе с фреймворком CakePHP. После изучения данной части Вы научитесь пользоваться документацией на официальном сайте фреймворка CakePHP, изучите базовые возможности фреймворка, а также создадите простейшее приложение – блог.

ВИДЕОУРОКИ ПЕРВОЙ ЧАСТИ КУРСА:

В первом уроке курса мы пройдемся по организационным моментам, рассмотрим структуру курса, узнаем основные источники документации, с которой будем работать на протяжении всего курса. Также обозначим необходимое программное обеспечение (сервер, редактор, версия фреймворка CakePHP)


Установка фреймворка на сервер и его настройка. Также, для облегчения дальнейшего процесса разработки мы установим плагин DebugKit и познакомимся с ним поближе

  • Урок 3: Установка консоли CakePHP

CakePHP, как и многие фреймворки, имеет генератор кода. Код генерируется с помощью специальной консольной утилиты CakePHP’s Bake console. Если нам нужно построить несложное работающее приложение с системой управления, не заморачиваясь с написанием кода, тогда консоль Кейка – то, что нужно. В этом уроке мы установим консоль кейка и рассмотрим нюансы ее установки

  • Урок 4: URL-адреса фреймворка CakePHP

Более плотно приступим к изучению фреймворка CakePHP и познакомимся со структурой URL-адресов Кейка. CakePHP уже по умолчанию работает с чистыми или, так называемыми ЧПУ-адресами (ЧПУ – Человеку Понятный УРЛ). При этом каждая часть (сегмент) этого адреса является значимой. Также CakePHP позволяет изменять имеющиеся по умолчанию адреса на любые другие, нужные нам, предоставляя для этих целей гибкие возможности раутинга (маршрутизации)

  • Урок 5: Соглашения об именованиях. Контроллеры

В этом уроке мы с Вами познакомимся с соглашениями или конвенциями об именованиях. Данные соглашения дают рекомендации по тому, как называть файлы, классы, методы и таблицы базы данных в разрабатываемом проекте. Следуя конвенциям, мы значительно облегчаем процесс разработки сайта и знакомимся с таким понятием, как магия Кейка (automagic). Также в этом уроке мы создадим свой первый контроллер

Контроллеры в паттерне MVC постоянно взаимодействуют с видами. Для того, чтобы наш вид получился динамическим, необходимо передавать в вид те или иные данные, которые часто получаем из базы данных. В этом уроке мы с Вами изучим метод set(), позволяющий передавать данные из контроллера в вид

  • Урок 7: Метод модели find(). Часть 1

Основа любого динамичного сайта заключается в хранении информации в базе данных и получении информации оттуда. За работу с базой данных в Кейке отвечает модель, методы которой можно использовать в контроллере. Один из таких методов – метод find(). Используя этот метод, мы можем получить информацию из базы данных. Ну а комбинируя параметры метода find(), мы можем гибко управлять получением данных

  • Урок 8: Метод модели find(). Часть 2

В этом уроке мы продолжим работу с параметрами метода find(). Вы увидите, как легко данный метод позволяет не только получить данные определенного поля или всей таблицы, но возвращает их в уже удобном для нас готовом массиве. Например, используя один только метод find(), всего одной строкой кода мы можем получить уже готовый к использованию массив, представляющий из себя дерево

  • Урок 9: Магические типы метода find()

Текущий урок мы также продолжим изучением метода find(). В данном уроке мы познакомимся с так называемыми магическими типами (Mafic Find Types). Используя этот метод и зная название поля (или полей), из которого необходимо получить данные, мы можем легко это сделать, не используя никаких дополнительных параметров. При этом здесь возникает столь много вариантов получения данных, что мы буквально можем экспериментировать с ними

  • Урок 10: Выводим данные в шаблон

Итак, мы научились получать и передавать данные в шаблон. Теперь пришла очередь познакомиться детальнее с еще одной составной частью паттерна MVC – видами. В этом уроке мы создадим файлы видов и выведем на экран полученные в них данные

  • Урок 11: Вывод отдельной статьи

В ходе изучения теории мы, конечно же, не обойдемся без практики. Взяв за основу пример из документации, давайте по мере изучения теоретической части фреймворка создадим простейший блог. В этом уроке мы, используя уже имеющиеся в нашем распоряжении знания, выведем на страницу отдельную статью из базы данных

В этом уроке мы познакомимся с еще одним методом модели – методом exists(). Этот метод очень полезен, когда нам необходимо просто проверить существование в базе данных той или иной записи

Фреймворк CakePHP предоставляет разработчикам 2 незаменимые вещи, ускоряющие процесс разработки – Хелперы (Heplers) и Компоненты (Components). Используя Хелперы и Компоненты, мы можем удобнее работать с сессиями, формами, легко и быстро создать постраничную навигацию для статей и прочая, и прочая. Кейк предлагает как уже готовые Компоненты и Хелперы, которыми мы можем пользоваться, так и возможность создавать собственные Компоненты и Хелперы

  • Урок 14: Хелпер для работы с формами

Одним из ключевых и часто используемых хелперов, является хелпер по работе с формами (Form Helper). Изучив работу с этим помощником, мы без труда создадим форму, которую можно использовать для сохранения информации в базу данных или отправки формы на Email. При этом помощник Form Helper позволяет не только создавать формы, но и автоматически заполняет их данными и буквально догадывается о том, какой тип поля формы необходимо сгенерировать

  • Урок 15: Добавляем данные в БД

Познакомившись с хелпером для работы с формами, мы с Вами теперь без проблем можем генерировать нужные нам HTML-формы. В этом уроке мы изучим сразу несколько методов, позволяющих сохранять информацию из форм в базу данных. Ключевыми здесь являются методы create() и save(). Последний метод напрямую предназначен для сохранения данных. При этом нам не нужно заботиться о получении данных из каждого конкретного поля. Достаточно вызвать метод, передать ему объект данных, и метод save() сделает все остальное

  • Урок 16: Валидация данных в CakePHP

Одной из ключевых задач и возможностей модели является валидация данных. Кейк предлагает разработчикам богатейшие возможности валидации, используя которые мы можем проверять практически все, что угодно: начиная от простейшего правила, когда строка должна состоять только из цифр и заканчивая сложными правилами загрузки файлов. Также CakePHP позволяет создавать собственные правила валидации

В этом уроке мы изучим работу с методом delete(). Как следует из названия, данный метод предназначен для удаления записей из базы данных. Также, используя этот метод, мы можем организовать каскадное удаление зависимых данных

В этом уроке мы изучим работу с Элементами (elements). Элементы используются в видах для того, чтобы в них можно было вынести повторяющиеся участки кода и затем многократно использовать в других видах. Например, мы вполне можем вынести в Элемент код меню или сайдбар

В этом уроке мы создадим еще одну функцию для управления нашим блогом – это будет функция редактирования данных. Для данного функционала мы воспользуемся уже знакомым нам методом save(), позволяющим сохранять данные в БД

  • Урок 20: Ассоциации и связи моделей

Одна из наиболее приятных и мощных возможностей CakePHP – ассоциации моделей. Эта возможность является одной из составляющих магии Кейка. Используя ассоциации, мы можем организовать всего одной строкой кода связи между различными таблицами базы данных. Благодаря установленным связям, нам не нужно писать запросы для получения дополнительных данных, эти данные Кейк любезно предоставит нам автоматически, используя ту самую автомагию (automagic)

  • Урок 21: Работаем с категориями

В этом уроке мы продолжим написание нашего приложения – блога. В уроке мы поработаем с категориями постов и закрепим на практике получение данных из БД и оперирование этими данными

  • Урок 22: Зависимость моделей на практике

В этом уроке мы вернемся к понятию ассоциаций и связей модели и посмотрим практические примеры работы с ассоциациями, а также увидим значительную практическую пользу использования свойств модели, отвечающих за установку связей между таблицами

Фреймворк CakePHP предоставляет специальный метод, позволяющий гибко работать с видами – это метод render(). Данный метод неявно вызывается в конце каждого экшена контроллера, подгружая вид по умолчанию. Но Кейк позволяет вызывать данный метод в любом месте кода контроллера, тем самым указывая, какой вид необходимо загрузить

  • Урок 24: Работа с темами в CakePHP

CakePHP позволяет не только гибко управлять шаблонами (Layout) и видами (View), но и предоставляет возможности для темизации сайта. Используя эти возможности, мы можем создать для одного и того же сайта несколько тем с абсолютно различным оформлением и использовать по желанию ту или иную тему. Это действительно мощная возможность Кейка

  • Урок 25: Приготовление кода в консоли (Cake Bake)

В данном уроке мы вернемся к вопросу работы с консольной утилитой Кейка, позволяющей «испекать код» (Cake Bake). В качестве примера мы приготовим с нуля коды Контроллера, Модели и Вида нашего простого сайта. При этом на приготовление кода мы потратим считанные минуты, ни единой строчки кода мы не будем писать самостоятельно, и весь сгенерированный код будет абсолютно рабочим

  • Урок 26: Регистрация и авторизация. Часть 1

В последних трех уроках первой части курса мы поработаем с компонентом Auth. Данный компонент позволяет не только ограничить доступ к определенным частям сайта или ко всему сайту целиком, но и организовать систему регистрации и авторизации, организовать работу с ролями

  • Урок 27: Регистрация и авторизация. Часть 2


В этом уроке мы продолжим работу с компонентом фреймворка CakePHP – Auth, позволяющим организовать работу с учетными записями пользователей

  • Урок 28: Регистрация и авторизация. Часть 3

В этом уроке мы завершим работу с компонентом фреймворка CakePHP – Auth, позволяющим организовать работу с учетными записями пользователей

  • Часть 2. Разработка сайта с использованием фреймворка CakePHP

Как уже отмечалось выше, большинство курсов по изучению фреймворка CakePHP ограничиваются созданием простейшего блога из примеров документации. Мы пойдем дальше и во второй, практической части нашего курса, будем создавать сайт, который Вы можете видеть на скриншотах ниже.

Основа данного сайта – каталог товаров. Функционал, который будет нами реализован в курсе:

  • категории
  • товары
  • карточка товара
  • страницы
  • авторизация
  • многоуровневое меню категорий с поддержкой неограниченного уровня вложенности
  • и, конечно же, управление всем этим, т.е. администраторская часть сайта.

После изучения данной части Вы закрепите на практике все изученное в первой части курса, а также почерпнете для себя много новой информации и возможностей.

ВИДЕОУРОКИ ВТОРОЙ ЧАСТИ КУРСА:

Итак, у нас есть верстка шаблона (html-страничка), который я нашел на одном из сайтов, предлагающем бесплатные шаблоны. Задачей первого урока будет перенос данного шаблона в структуру фреймворка CakePHP. Мы должны перенести код самой html-странички, а также скрипты, стили, картинки и шрифты. В итоге, при обращении к главной странице нашего сайта мы должны увидеть картинку, которая ничем не должна отличаться от исходного шаблона HTML

  • Урок 2: Создаем первый контроллер сайта

Во втором уроке мы начнем превращать пока что статичный шаблон в динамичную страницу нашего сайта. Здесь мы создадим свой первый контроллер, который будет работать с главной страницей сайта и заниматься выводом новинок товаров на главную страницу сайта

  • Урок 3: Формируем многоуровневое меню. Часть 1

Изюминкой выбранного нами шаблона и, пожалуй, наиболее сложной в реализации его частью является меню категорий. Это красивое выпадающее меню, которое можно сейчас встретить на многих интернет-магазинах, предлагающих различные категории товаров. Основная сложность реализации нашего меню заключается в его многоуровневости, т.е. пользователь может создавать сколь угодно много вложенных друг в друга категорий и все эти категории должны появиться на сайте с соблюдением уровней вложенности и соответствующим визуальным оформлением вложенности. Благо, Кейк предлагает нам несколько возможностей по реализации и работе с деревьями

  • Урок 4: Формируем многоуровневое меню. Часть 2

В этом уроке мы продолжим реализовывать многоуровневое меню категорий для нашего сайта

  • Урок 5: Создаем компонент меню

Итак, мы создали многоуровневое меню, и оно замечательно работает. Однако, пока что это меню работает только на главной странице. Нам же необходимо, чтобы меню было доступно на всех страницах сайта. Чтобы избежать дублирования кода, мы создадим собственный компонент – компонент Меню – который будем использовать на всех страницах сайта

В этом уроке мы займемся реализацией блока Новые товары на главной странице. К слову, навигация по данному блоку реализована в шаблоне с довольно привлекательным эффектом. Итак, мы выведем все имеющиеся на сайте новинки товаров и реализуем навигацию по блоку новинок

В данном уроке мы будем работать с шаблоном категорий. Этот шаблон отличается от главной страницы сайта, здесь уже есть колонка сайдбара, выводятся товары каталога или выбранной категории, присутствует постраничная навигация (пагинация) по товарам

  • Урок 8: Выводим товары категорий

Этот урок мы посвятим работе с логикой по выборке и выводу на страницу товаров категорий. Мы предусмотрим вывод всех товаров или вывод товаров только выбранной категории. Также мы должны предусмотреть обращение к родительской категории и, соответственно, реализовать выборку товаров, как из запрошенной категории, так и из всех дочерних категорий

Данный урок будет посвящен работе с постраничной навигацией (пагинацией). В теоретической части мы не затрагивали этот момент, здесь же мы детально его изучим. Для работы с пагинацией CakePHP предлагает специальный Компонент и Хелпер, которые, работая в паре, сделают реализацию пагинации предельно простой задачей

  • Урок 10: Меню категорий в сайдбаре

Согласно нашему шаблону, в сайдбаре должно находиться меню категорий. При этом там должны быть представлены не все категории, а лишь та, к которой обратился пользователь. Также, если у запрошенной категории имеются дочерние категории, тогда они также должны быть представлены в меню сайдбара

Поскольку основа создаваемого нами сайта – это каталог товаров, соответственно, нам необходима карточка товара, в которой мы отобразим детальную информацию по выбранному товару. В этом уроке мы займемся реализацией карточки товара, создав необходимые контроллер, модель и вид

Поиск – это практически неотъемлемый элемент любого сайта. Ну а если говорить о каталоге товаров, то поиск – обязательный элемент, поскольку найти нужный товар среди всего многообразия товаров на сайте, порой, возможно только через поиск. В данном уроке мы реализуем поиск по товарам для нашего сайта

Наш шаблон предполагает не только меню категорий, но и меню страниц, которое так же, как и меню категорий, должно присутствовать на всех страницах нашего сайта. В этом уроке мы создадим меню страниц, и при его создании мы будем использовать уже созданный нами ранее компонент Меню

В этом уроке мы с Вами поработаем с еще одним компонентом Кейка – CakeEmail. Данный компонент представляет собой класс, позволяющий работать с отправкой писем на email. На нашем сайте есть страница контактов, которая может предполагать наличие контактной формы. Давайте создадим такую форму и реализуем логику отправки данных из нее на email

  • Урок 15: Архитектура админской части

Начиная с текущего урока, мы приступаем к разработке админской части нашего сайта. В этом уроке мы продумаем архитектуру админской части, более плотно поработаем с маршрутизацией (раутингом) и узнаем, как можно работать с префиксами в URL-адресах

  • Урок 16: Ограничиваем доступ к админке

Данный урок будет посвящен ограничению доступа к админской части сайта. Мы воспользуемся уже знакомым нам компонентом Auth, создадим форму авторизации и ограничим доступ к админским экшенам

Итак, мы добрались до управления товарами. В этом уроке мы реализуем редактирование товара. Администратор сможет изменять название, описание товара, его цену и прочие данные, а также перемещать его в нужную категорию

  • Урок 18: Дерево категорий товара

В этом уроке мы реализуем дерево категорий товара для админки. За основу возьмем аналогичное дерево из пользовательской части и внесем в него некоторые правки, чтобы данный компонент одинаково хорошо работал как в пользовательской части, так и в админке

  • Урок 19: Устанавливаем визуальный редактор

Обязательным компонентом админской части является визуальный редактор, поскольку администрировать сайт может пользователь, который впервые слышит слово HTML. Соответственно, мы должны сделать удобным процесс редактирования даже для таких пользователей. В этом уроке мы установим и настроим визуальный редактор CKEditor, а также интегрируем файловый менеджер KCFinder. В процессе мы узнаем нюансы установки и настройки подобных вещей в CakePHP

В этом уроке мы реализуем функционал добавления товара. Здесь все будет предельно просто, поскольку данный функционал очень напоминает реализованный ранее функционал редактирования товара

Последним действием по управлению товаром будет его удаление, которое мы и реализуем в текущем уроке

Цукерберг рекомендует:  Создание и сборка проекта с Maven. Примеры работы с зависимостями и свойствами

Основываясь на реализованном ранее функционале управления товарами, мы можем легко реализовать управлением страницами. Здесь мы наглядно увидим, как фреймворк облегчает нам жизнь при написании кода. Фактически весь необходимый функционал – добавление, редактирование и удаление страниц – мы реализуем за один текущий урок

  • Урок 23: Управление метаданными

В этом уроке будет показано, как организовать управление метаданными страниц Вашего сайта. Мы выведем название страницы (title), ее ключевые слова (keywords) и описание (description)

  • Урок 24: Управление категориями

Данный урок будет посвящен реализации функционала по управлению категориями. Здесь мы должны учесть ряд нюансов при удалении категории: запретить удаление категорий, в которых есть дочерние категории или товары. Предусмотрев эти нюансы, мы сохраним целостность базы данных

  • Урок 25: Загрузка картинок. Часть 1


Последние два урока мы посвятим работе с загрузкой картинки товара и ее ресайза. В этих уроках мы львиную долю работы будем проводить в модели, используя правила валидации при загрузке файлов, которые предлагаются фреймворком. Также мы создадим собственное правило валидации и опишем методы, работающие с данным правилом. В итоге будет реализован функционал по загрузке картинок и их ресайзу

  • Урок 26: Загрузка картинок. Часть 2

В данном уроке мы продолжим реализацию функционала по загрузке и ресайзу изображений для товаров

Авторские статьи Начальный практикум в CakePHP

3.4 Кэширование.
К счастью разработчиков CP представляет несколько механизмов управления кэшированием. На мой
взгляд они очень удобны. С их помощью мы сейчас настроем кэширование страниц с описаниями
продуктов и отзывами о них. Стандартно, предлагается несколько вариантов хранения кэшированных
данных, но мы будем использовать файловый, он стоит по умолчанию. За все нужные нам операции
отвечает хэлпер «Cache» ( http :// book . cakephp . org / view /213/ Cache ). Подключив его, настроим
кэширование только результата действия view ( http :// book . cakephp . org / view /346/ Caching — in — the —
Controller). Для этого обозначим массив «cacheAction» как свойство контроллера и поместим туда
ячейку «view/» со значением «86400».

На этом настройка кэширования завершена. Попробуйте подобавлять отзывы и проверить изменился ли
внешний вид страницы.

3.5 Логирование
И последнее что будет рассмотренно в этой статье — логирование данных о работе приложения
(http://book.cakephp.org/ar/view/157/Logging). Подобный функционал может очень пригодиться для
отслеживания ошибок в крупных приложениях, когда сходу не сообразишь где и какой произошла сбой.
Никаких компонентов или хэлперов подключать здесь не нужно. Единственная функция, нужная для
логирования, доступна всегда. Это функция «log». Ей нужно передавать 2 параметра. Первый —
сообщения. Им может быть информация об ошибке, сбое, действии пользователя и т.п. А второй — тип
логируемой информации. В качестве этого параметра может быть передана одна из двух констант —
«LOG_ERROR» и «LOG_DEBUG» — ошибочная или отладочная информация соответственно.
Рассмотрим пример с ошибкой. В методе «view» контроллера «Product» может быть ошибочно указан
товар в ссылке. В связи с этим метод «getProductIdByTName» вернёт ложное значение. Давайте добавим
после вызова этого метода строку

и пройдём по ссылке http://cakephp/product/view/11111111, вызвав тем самым несуществующий товар.
Сообщение будет записано в файл «error.log». Он находится там же где и все логи — в директории
«./app/tmp/logs». Открыв его Вы обнаружите что самая последняя надпись содержит информацию типа
этой — «2009-03-16 20:07:33 Error: Request to non-existing product». А можно вообще выделить в
отдельную группу например только лог-записи связанные с товарами. Для этого в качестве константы
можно передать строку, скажем, «products». В таком случае автоматически создастся файл «products.log»
и в него будет записана вся передаваемая информация.
Вот и всё. Код нашего магазина готов и нормально функционирует. Если у Вас что-то не получилось то
можете взять исходный код всего приложения в прикреплённом архиве «ready.zip».

4.0 Заключение.
На мой взгляд фреймворк хороший, но очень сильно запутанный. Иногда использование некоторых
функций не укладывается в голове — по логике они должны использоваться, например, в контроллере, а
используются в модели. Что-то должно быть компонентом, а является хэлпером. Не понравились и
инструменты для работы с БД. Я больше предпочитаю интерфейсы подобные паттерну ActiveRecord. Ну
и худой функционал — мало хэлперов и компонентов. И всё-таки, как говориться, на вкус и цвет.
Надеюсь, что он понравится читателям. Удачи Вам в Ваших проектах!

Bookmarker Tutorial

П еред тем как приступить к созданию приложения убедитесь, что у вас установлен локальный сервер и скачена актуальная версия самого фреймворка CakePHP. Так же убедитесь в том, что локальный сервер запущен, а заготовка вашего приложения открывается через адресную строку браузера (например: http://yousite.loc) в виде стартовой страницы фреймворка (вид на момент написания статьи):

Страница приветствия кейка, так же, выводит информацию о настройке расширений PHP, плагина DebugKit и информацию о подключении вашего приложения к базе данных. Если напротив соответствующей настройки фигурирует зеленый маркер, то проблем нет, в противном случае маркер будет красным и вам придется изменить необходимые настройки PHP (в статье по установке фреймворка CakePHP 3 это рассматривалось). На рисунке выше видно, что красный маркер стоит около настройки подключения к базе данных, которое мы ещё не успели произвести.

Создание базы данных

Далее, давайте создадим базу данных для нашего сайта закладок. Если вы еще не сделали этого, то создайте пустую базу данных, которую мы будем использовать в этом учебнике, с именем по вашему выбору, например, cake_bookmarks.

Внимание! При создании базы данных не забудьте указать нужную вам кодировку. В моем случае это будет utf8_general_ci.

Чтобы создать в базе необходимые таблицы, можно выполнить следующий SQL запрос:

Обратите внимание, что в таблице bookmarks_tags (таблица для организации связи многие ко многим) используется составной первичный ключ. CakePHP поддерживает составные первичные ключи практически везде, что облегчает проектирование мульти-арендуемых (multi-tenanted) приложений.

Имена таблиц и столбцов, которые мы использовали, не были произвольными, а были сформированы на основании соглашений об наименованиях. Это позволяет нам эффективно использовать возможности CakePHP и избежать необходимости выполнять дополнительные настройки.

Конфигурация базы данных

Далее, давайте скажем CakePHP, что у нас существует база данных и мы желаем к ней подключиться. В большинстве случаев вам больше не придется возвращаться к этой настройке при работе с приложением.

Для выполнения подключения подставьте в массив Datasources.default конфигурационного файла config/app.php значения, которые применимы для вашей базы данных. Это username (имя пользователя, для локального сервера — это как правило root), password (пароль — для локального сервера как правило отсутствует) и database (имя базы, в нашем примере это cake_bookmarks). Готовый массив-пример конфигурации БД может выглядеть следующим образом:

После того, как вы сохраните файл config/app.php и обновите стартовую страницу CakePHP, красный маркер, рядом с информацией о подключении к базе данных, изменится на зеленый.

Внимание! Копия файла конфигурации CakePHP (конфигурация по умолчанию), находится в config/app.default.php. Поэтому, если вы что либо напортачили с конфигурацией, всегда можно исправить ситуацию, воспользовавшись указанной копией.

Генерация основного кода

Поскольку наша база данных соответствует соглашениям CakePHP, мы можем использовать консольное приложение Кейка для быстрого создания базовой структуры сайта. Для этого, находясь в папке своего проекта, вызовите командную строку и выполните следующие команды:

// Если у вас Windows, то используйте обратный слэш (например bin\cake bake all users).
bin/cake bake all users
bin/cake bake all bookmarks
bin/cake bake all tags

Консоль фреймворка создаст необходимые контроллеры, модели и представления для наших пользователей (users), закладок (bookmarks) и тегов (tags). CakePHP, так же, учтет логику взаимодействия между указанными моделями (связи, которые мы прописывали при создании таблиц базы данных). Если вы остановили свой локальный сервер, запустите его и перейдите к http://yousite.loc/bookmarks.

В окне браузера вы должны увидеть простой, но функциональный интерфейс управления данными приложения, предоставляющий доступ к созданным таблицам базы данных. Используя интерфейс, добавьте по нескольку записей в каждую таблицу.

Внимание! Если вы видите сообщение, что страница не найдена: Not Found (404), убедитесь, что в Apache загружен модуль mod_rewrite.

Добавление метода хэширования паролей

При создании пользователей (по адресу http://yousite.loc/users), вы, вероятно, заметили, что пароли хранятся в виде обычного текста. Это очень плохо с точки зрения безопасности, так что давайте эту ситуацию исправим.

Так же, настало время, чтобы поговорить о слое модели. В CakePHP, существуют методы, которые управляют коллекциями объектов (например: пользователи, закладки, теги) и методы, относящиеся к единичному объекту (например: пользователь, закладка, тег). Методы, которые работают с коллекциями располагаются в классе таблицы, в то время как функции, принадлежащие к одной записи находятся в классе единичного объекта (Entity).

Например, хеширование пароля производится для отдельной записи (пользователя), поэтому оно реализуется в классе Entity (для одиночного объекта). Хеширование будет выполняться каждый раз, когда происходит присваивание значений свойствам объекта при его сохранении. Для реализации указанной задачи, внесем изменения в файле src/Model/Entity/User.php:

Теперь, при создании нового пользователя, либо при изменении пароля существующего пользователя, на странице http://yousite.loc/users вы уведите зашифрованные пароли, находящиеся в столбце password. По умолчанию, CakePHP осуществляет хэширование паролей согласно стандарту bcrypt. Так же, вы можете использовать другие алгоритмы хэширования, такие как sha1 или md5.

Внимание! Если у вас не происходит хэширование пароля, то убедитесь, что название функции соответствует названию столбца в базе данных. Например: если столбец password, то функция будет называться _setPassword, но если вы назвали столбец pass, то название функции будет _setPass.

Получение закладок по тэгам

Теперь, когда мы храним пароли безопасно, можно определенным образом расширить наше приложение. При накоплении коллекции закладок, полезно иметь механизм их сортировки по определенным признакам (тэгам). Далее мы реализуем маршрут (route), действие контроллера (action), и метод для поиска закладок по тэгам.

В идеале нам нужен URL, который бы выглядел следующим образом: http://yousite.loc/bookmarks/tagged/funny/cat/gifs. Это позволит нам найти все закладки, которые имеют теги ‘funny’, ‘cat’ или ‘gifs’. Итак, для того, чтобы продолжить, мы добавим новый маршрут. Для этого внесем соответствующие записи в конфигурационный файл маршрутизации config/routes.php, который будет выглядеть следующим образом:

И так, мы определили новый маршрут для пути /bookmarks/tagged/, который вызовет функцию tags() в контроллере BookmarksController (BookmarksController::tags()). Таким образом, прописывая маршруты, вы можете определять как будут выглядеть ваши URL адреса и как они будут реализовываться. Теперь, если вы посетите маршрут http://yousite.loc/bookmarks/tagged, то увидите страницу ошибки от CakePHP, информирующую о том, что действие контроллера tags() не существует. Давайте реализуем этот отсутствующий метод, путем внесения соответствующего изменения в контроллер src/Controller/BookmarksController.php:

Более подробную информацию по получению доступа к другим данным запроса ($this->request), вы найдете, обратясь к разделу Request официального сайта Кейка.

Создание метода поиска

Для того, чтобы контроллеры нашего приложения не были перегружены кодом, большую часть логики в CakePHP принято размещать в моделях. Если вы посетите URL адрес /bookmarks/tagged, то увидите сообщение об ошибке, говорящее, что метод findTagged() еще не реализован. Чтобы это исправить, давайте внесем соответствующие изменения в файл src/Model/Table/BookmarksTable.php

Выше мы реализовали свой собственный (пользовательский) метод поиска find(). Это очень мощная концепция в CakePHP, которая позволяет создавать и повторно использовать разного рода запросы. Finder методы всегда получают объект Query Builder (объект запроса) и массив опций в качестве параметров. Искатели могут манипулировать запросами и добавлять любые необходимые условия или критерии, возвращая после своего завершения измененный объект запроса. В нашем поиске мы использовали метод innerJoinWith(), позволяющий находить различные закладки, которые относятся к соответствующему тегу (тегам). Метод innerJoinWith(), в качестве аргумента принимает анонимную функцию, определяющую условия запроса (внутри обратного вызова мы используем конструктор запросов, чтобы определить условия, согласно которым будут фильтроваться закладки, относящиеся к тегу поиска).

Создание вида (View)

Теперь, если вы посетите URL /bookmarks/tagged, CakePHP покажет ошибку, которая укажет на то, что не был создан файл представления. Далее, давайте создадим такой файл (src/Template/Bookmarks/tags.ctp) для нашего действия tags() и поместим в него следующее содержание:

В приведенном выше коде используется HTML и Text помощники (helpers — хелперы), которые помогают упростить процесс создания внешнего вида нашего представления. В примере, так же, используется функция h — аналог php функции htmlspecialchars(). С целью исключения проблем, связанных с инъекциями, настоятельно рекомендуется пропускать все данные, получаемые от пользователей, через функцию h().

Файл tags.ctp, который мы только что создали, следует соглашениям CakePHP для файлов шаблонов представления. Соглашение состоит в том, что имя файла шаблона повторяет название экшена (tags()) контроллера, записанное в нижнем регистре.

Обратите внимание, что в шаблоне вида использовались переменные $tags и $bookmarks, которые были определены методом set() в контроллере и отправлены в представление. Слой View сделал их доступными в шаблоне как локальные переменные.

Теперь, если вы посетите URL адрес /bookmarks/tagged/funny, приложение выведет в браузер все закладки, относящиеся к тегу ‘funny’.

В результате, мы создали базовое приложение для управления закладками, тегами и пользователями. Тем не менее, любой, зашедший на страницу закладок может видеть все записи. В следующей главе, мы осуществим аутентификацию и ограничим видимость закладок в зависимости от их принадлежности текущему пользователю.

На этом пока все, жду вас во второй части примера по созданию сайта закладок на основе фреймворка CakePHP (Bookmarker Tutorial, часть 2).

cakephp Начало работы с cakephp

замечания

В этом разделе представлен обзор того, что такое cakephp, и почему разработчик может захотеть его использовать.

Следует также упомянуть о любых крупных предметах в рамках cakephp и ссылаться на связанные темы. Поскольку Documentation for cakephp является новым, вам может потребоваться создать начальные версии этих связанных тем.

Версии

Версия Дата выхода
1.2.0 2008-12-26
1.3.0 2010-04-25
2.0.0 2011-10-17
3.0.0 2015-03-22

Основной первый пустой проект


Начальное создание и загрузка (CakePHP 3.x)

Самый простой способ создать новый проект CakePHP — через Composer (если вы не знаете о композиторе, посмотрите здесь для получения дополнительной информации)

Установить композитор

Если вам нужно установить его и запустить на компьютере с Windows, следуйте этому руководству

Если вы находитесь в Linux / Unix / OSX, следуйте этому руководству

Создайте первый проект CakePHP

Откройте окно консоли и перейдите к установке php (в Windows с установкой xampp по умолчанию это C:\xampp\php )

Чтобы создать пустой проект, выполните следующую команду:

Выпечка / Model / View / Контроллеры

Магия CakePHP — выпечка — автоматическое создание контроллера, модели и кода вида с базовыми вариантами CRUD.

Перед выпечкой необходимо настроить соединение с базой данных. Для этого вам нужно отредактировать файл config/app.php в своем проекте.

Если ваша база данных подключена правильно, вы затем bin/cake bake в корневой папке вашего проекта в окне консоли.

Это должно вывести что-то вроде этого:

Для простоты мы собираемся испечь все с настройками по умолчанию. Для этого вы вводите

Это будет выводить что-то в этом направлении:

Путем запуска cake bake all модель, таблица, контроллер, файлы крепления и файлы просмотра. Запустите это для каждого возможного имени модели, и у вас есть действующий проект с базовыми параметрами CRUD.

Теперь вы можете открыть браузер и посмотреть, как он выглядит и начать расширять проект по вашей собственной логике

CakePHP 2.x Основные сведения

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

CakePHP имеет несколько основных папок

  1. app — It Содержит наш исходный код приложения, весь наш код находится под этим каталогом.
  2. lib — Это освободительное ядро ​​cakephp, оно содержит весь базовый код библиотеки cakephp. Редактирование кода внутри этого каталога не предлагается, поскольку они могут вызвать ошибку при обновлении библиотеки cakephp.
  3. plugins — содержит код плагинов cakephp, который будет использоваться для нашего приложения.
  4. vendors — содержит внешний код, этот код не будет использовать библиотеку cakephp.
  5. index.php — это индексный файл.

У нас может быть несколько приложений, размещенных внутри одного проекта. т.е. они могут использовать те же папки lib, plugin и vendors.

Чтобы изменить код lib, лучше всего расширить их в нашей папке приложения и выполнить изменения.

Папки плагинов и вендоров разделяются всеми приложениями, размещенными в том же каталоге.

index.php — это файл, который вызывается первым.

Теперь мы должны перейти в нашу папку приложений

Структура папок CakePHP3

После того, как вы скачали, это файлы и папки, которые вы должны увидеть:

  • В папке bin хранятся исполняемые файлы консоли Cake.
  • В папке конфигурации хранятся файлы конфигурации, используемые CakePHP. Здесь должны храниться сведения о соединении с базой данных, начальной загрузке, основных конфигурационных файлах и т. Д.
  • В папке плагинов хранятся плагины, которые использует ваше приложение.
  • Обычно папка журналов содержит ваши файлы журналов, в зависимости от конфигурации журнала.
  • В папке src будут размещены файлы вашего приложения.
  • В папке с тестами вы найдете тестовые примеры для своего приложения.
  • Папка tmp — это где CakePHP хранит временные данные. Фактические данные, которые он хранит, зависят от того, как вы настроили CakePHP, но эта папка обычно используется для хранения описаний моделей, а иногда и для информации о сеансе.
  • В папке поставщика устанавливаются зависимости CakePHP и других приложений. Сделайте личное обязательство не редактировать файлы в этой папке.
  • Каталог webroot является открытым корнем документа вашего приложения. Он содержит все файлы, которые вы хотите публично достигать.

Убедитесь, что существуют папки tmp и logs и доступны для записи, в противном случае производительность вашего приложения сильно пострадает. В режиме отладки CakePHP предупредит вас, если это не так.

Внутри папки src

В папке src CakePHP вы найдете большую часть своей разработки приложений.

Консольная папка содержит консольные команды и консольные задачи для вашего приложения. Дополнительные сведения см. В разделе «Корпуса, задачи и инструменты консоли».

Папка контроллера содержит контроллеры вашего приложения и их компоненты.

Папка Locale хранит строковые файлы для интернационализации.

Папка Model содержит таблицы, сущности и поведение вашего приложения.

View — здесь представлены классы презентаций: ячейки, помощники и файлы шаблонов.

Шаблон — презентационные файлы размещаются здесь: элементы, страницы ошибок, макеты и файлы шаблонов просмотра.

Установка или настройка

Требования

Следующее руководство по установке предназначено для cakephp 2.8 и выше. Все версии cakephp ниже 2.8 не совместимы с php 7

HTTP-сервер. Например: Apache. Наличие mod_rewrite является предпочтительным, но отнюдь не обязательным.

  • PHP 5.5.9 или больше (включая PHP 7).
  • Расширение PHP mbstring
  • встроенное расширение PHP

Внимание! Как в XAMPP, так и в WAMP, расширение mbstring работает по умолчанию. В XAMPP включено расширение intl, но вы должны раскомментировать расширение php_intl.dll в php.ini и перезапустить сервер через панель управления XAMPP. В WAMP расширение по умолчанию «активировано» по умолчанию, но не работает. Чтобы заставить его работать, вы должны пойти в папку php (по умолчанию) C: \ wamp \ bin \ php \ php , скопировать все файлы, которые выглядят как icu * .dll, и вставить их в каталог apache bin C: \ WAMP \ Bin \ Apache \ апача <версия>\ Bin. Затем перезапустите все службы, и все будет в порядке.

Хотя механизм базы данных не требуется, мы предполагаем, что большинство приложений будут использовать его. CakePHP поддерживает различные механизмы хранения базы данных:

  • MySQL (5.1.10 или выше)
  • PostgreSQL
  • Microsoft SQL Server (2008 или выше)
  • SQLite 3

Требования

Обычно я делаю установку apache и mysql на linuxbox. Я тоже могу использовать окна, но я не рекомендую это;) Итак, я обычно делаю новую запись в файле / etc / hosts, чтобы сделать sitename доступным для cakephp.

следующий шаг для копирования всех файлов cakephp в подкаталог внутри / home / myusername / public_html / caketest

то я настроил сайт на apache (не обязательно),

DocumentRoot «/ home / myusername / public_html / caketest» Имя_сервера caketest.local
# Это должно быть опущено в производственной среде SetEnv APPLICATION_ENV development

перезапустите apache. вам также необходимо отредактировать файлы .htaccess и поместить директиву RewriteBase с помощью пути hte к фактическому каталогу, например


создать базу данных, установить соединение db в файлах конфигурации торта, и все. вы можете указать свой браузер на http: //caketest.local, если вам не нужен URL-адрес тестового сайта, вы можете пропустить хосты и создание Apache-vhost, но URL-адрес должен быть http: / localhost /

еще одна важная вещь — включить userdir modul в apache, а также проверить, разрешено ли использование php в userdirs.

CakePHP: создаем сайт для закладок.

В статье рассказывается как с помощью фреймворка CakePHP создавать быстрые и легкие приложения, затрачивая при этом минимум времени и сил. На примере создания сайта для закладок, практически показаны методы и приемы работы с контроллерами, методами и представлениями CakePHP.

Если вы эксперт в CakePHP, вы знаете, как находить контроллеры, углубляться в модели и создавать представления, впечатляющие публику. Но, войдя во вкус быстрой разработки приложений с CakePHP, вы хотите сделать еще, причем больше за меньшее время. Что ж, имеете право: и мы посмотрим, как расширить функционал нашего приложения с помощью модулей CakePHP. Это следствие принципа DRY (Don’t repeat yourself — Не повторяй себя). Найдя решение проблемы однажды, разумным образом оформите его и поделитесь им со всем миром, чтобы каждый мог что-то вложить и что-то получить от этого решения. А для этого прихватите немного кода, уже написанного другими, и воспользуйтесь модулями расширения, чтобы сэкономить массу времени.

Рискнем создать сайт для хранения закладок, где будут храниться не только адреса с их описанием, но и симпатичные миниатюры. Так как мы живем в эпоху социальных сетей, добавим возможность быстрого и удобного размещения закладок в социальных сетях, чтобы друзья и знакомые узнали о них.

Как всегда, потратим немного времени на то, чтобы убедиться, что наша база данных соответствует соглашениям и стандартам CakePHP, чтобы каркас сделал за нас всю трудную работу. Желающим отклониться от предложенных стандартов и структур советую заглянуть на страничку http://book.cakephp.org/view/901/cakephp-conventions — там можно получить информацию о том, как уйти в свободное плавание собственным путем.
Немного поразмыслим над данными, которые нам нужно будет хранить. Нам понадобятся URL, пользователи, рейтинги, чтобы при размещении адресов закладок в Twitter, Facebook или любой другой социальной сети пользователи смогли оценить содержимое, если оно им нравится.
CREATE DATABASE `bookmark`;
USE `bookmark`;
CREATE TABLE `urls` (
`id` CHAR(36) NOT NULL PRIMARY KEY,
`user_id` CHAR(36) NOT NULL,
`name` VARCHAR(128) NOT NULL,
`url` TEXT,
`created` DATETIME,
`modified` DATETIME
);
CREATE TABLE `users` (
`id` CHAR(36) NOT NULL PRIMARY KEY,
`username` VARCHAR(45) NOT NULL,
`password` VARCHAR(255) NOT NULL,
`email` VARCHAR(255) NOT NULL,
`created` DATETIME,
`modified` DATETIME
);

Минуточку, но ведь это, конечно, не все таблицы, которые нам нужны? Список параметров, которые мы хотели хранить для каждой вкладки, был довольно длинным. И непохоже, что в этой таблице хватает полей на все данные — если не считать того момента, что каждый модуль расширения может хранить необходимую информацию из базы данных самостоятельно, чтобы гарантировать, что в пакете модуля содержится весь предоставляемый функционал, включая требования базы по хранению данных.
Ну и как это работает? Для этого необходимо воспользоваться либо оболочкой «Schema», поставляемой с CakePHP, либо модулем расширения «Migrations». Мы воспользуемся модулем миграции.
Bake — консольная команда, с помощью которой можно генерировать код, выполнять миграции, запускать тесты и многое другое. Для удобства работы с ней из консоли, путь cake/console внутри пакета CakePHP нужно включить в переменную окружения PATH. Сделать это можно так:
$export PATH=»$PATH:/path/to/cakephp/cake/console»
Единственное оставшееся требование — РНР должен быть доступен в командной строке. Во многих дистрибутивах есть пакет php-cli или подобный ему, в котором есть исполняемый файл РНР для командной строки.
Начнем новый проект и создадим базовую структуру, от которой и будем отталкиваться. Выполняем следующие команды:
$cake bake project bookmark
$cd bookmark
CakePHP создал базовую структуру приложения. Она содержит каталоги и ряд исходных файлов для обслуживания статических страниц. Покопайтесь в ней, присмотритесь, чем именно вас снабдили.
Прежде чем заняться выпеканием, нужно дать понять CakePHP, как подключится к нашей базе данных. Скопируйте файл /config/database.php.default в /config/datаbase.php. Введите туда настройки своей базы данных, имя пользователя и пароль для базы данных. Вот, примерно, что у вас должно получиться:
`mysql`,
`persistent` => false,
`host` => `localhost`,
`login` => `login`,
`password` => `password`,
`database` => `bookmark`,
`prefix` => «,
);
>
Заметьте, что настройки базы test из этого файла удалены. Тестовая конфигурация используется при модульном тестировании, а мы в рамках нашего проекта этим заниматься не будем.
Давайте приступим к созданию моделей, представлений и контроллеров для таблиц базы данных, которые мы создали ранее. С помощью команд создадим весь код, необходимый для работы приложения в целом, потом нам останется только его модифицировать.
$cake bake all user
$cake bake all url
Пусть вас не пугает объем вывода команды bake, чем больше данных она выводит, тем больше времени мы сэкономим на написании кода. Взглянув на вывод, вы увидите все пути и имена файлов, которые были созданы для нас. Теперь у нас есть пользователь и система управления ссылками, и вы можете заходить на сайт, чтобы добавлять или изменять какую-либо информацию. Попробуйте открыть ссылку /users. У меня каталог находится в корне веб-сервера и адрес будет таким: http://localhost/bookmark/users. Откроется страница со списком пользователей, где вы сможете найти ссылки для добавления пользователей и изменения информации о них.
Быстренько пробежимся по тому, как закрыть сайт от доступа посторонних, чтобы мы смогли создавать пользователей и входить в систему, но без входа в систему доступ ко всему был бы закрыт.
Откройте файл app_controller.php в корне проекта. Это пустой контроллер, от которого наследуют свой функционал все остальные контроллеры приложения. Все сделанное в нем будет доступно во всех остальных контроллерах, так что это прекрасное место для аутентификации, которая заставит пользователей входить на сайт и помешает незваным гостям изменять данные. Добавьте компоненты «Auth» и «Session». Теперь ваш контроллер AppController длжен выглядеть так:
set(‘authUser’,$this->Auth->user());
return parent::beforeFilter;
>
>
Как видите, мы изменили вызов set в функции beforeFilter. Это гарантирует нам доступ к информации о текущем пользователе во всех представлениях сайта. Если текущего пользователя нет, this установится в null.
Затем откройте /controllers/users_controller.php и добавьте действие login. Оно может быть пустым: о его содержании позаботиться CakePHP. Пока мы тут, давайте добавим еще и logout, чтобы дать возможность пользователям выходить из системы:
function login() <
>
function logout() <
return $this->redirect($this->Auth->logout());
>
Наконец, в контроллере нужно гарантировать, что для создания пользователя не придется входить в систему, иначе система заблокируется, так как в ней не пользователей. Добавляем следующий метод в контроллер users:
function beforeFilter() <
$this->Auth->allow(‘add’);
return parent::beforeFilter();
>
Последний фрагмент этой мозайки — файл представления view, который был создан утилитой bake. Он примет имя пользователя и пароль и позволит пользователям войти в систему. Создайте представление login в новом файле: /views/users/login.ctp:

Снова откройте список пользователей users, и вы незамедлительно будете перенаправлены на форму авторизации. Теперь попробуйте зайти на страницу добавления пользователя, и вы увидите, что ее можно просматривать без ввода логина и пароля.
Пора выпить чашку чаю/кофе, кому что нравиться — сайт работает, данные мы защитили. Пробегитесь по приложению и создайте нового пользователя. Зайдите на сайт под этим пользователем и проверьте, что все работает правильно, добавьте пару ссылок. Теперь, когда сайт вам знаком и вы довольны его работой, пора подключить несколько модулей и заставить работать некоторые примочки.
Давайте отыщем необходимые модули, загрузим их и настроим каталоги в /app/plugins. Для загрузки модулей воспользуемся Git. С помощью Git модули грузятся быстрее. Вдобавок, это прекрасная возможность научится работать с Git как со средством управления версиями:
git clone https://github.com/cakedc/migration.git plugins/migrations
git clone https://github.com/cakedc/ratings.git plugins/rating
git clone https://cakedc/search.git plugins/search
git clonr https://github.com/predominant/cake_social.git plugins/cake_social
git clonr https://github.com/predominant/goodies.git plugins/goodies
Только что мы сэкономили несколько месяцев на разработке. Я не шучу. Мы воспользовались набором модулей с открытым исходным кодом, которые доступны любому разработчику.
Ранее говорилось, что нам не хватает таблиц в базе данных, и мы позаботимся об этом с помощью миграции баз данных. Сейчас вы увидите, как просто создать таблицу базы данных для модулей и повторного использования кода в проектах. Не всем модулям нужна миграция, и не все модули ее предусматривают. У тех, у кого она есть, в каталоге config есть подкаталог migrations. Например, вы можете пройтись по модулям и посмотреть, кому из них нужна миграция, или просто запустить ее для всех: тогда для модулей, которым она не нужна, появится сообщение об ошибке — тут-то они нам и попадутся.
Выполните следующую команду, чтобы завершить настройку таблиц для добавленных модулей:
$cake migration -plugin ratings all
Теперь у вас есть все необходимые таблицы.
Для начала обеспечим возможность выставления рейтинга. Рейтинг должен быть только у URL-адресов. Добавить компонент очень просто: открываем UrlsController в файле /controllers/urls_controller.php и добавьте компонент Ratings:
class UrlsController extends AppController <
var $components=array(‘Ratings.Ratings’);
//.. existing code
>
Свежедобавленный компонент сам подключается вспомогательный класс, необходимый для отображения формы с рейтингом, а также обрабатывает сохранение и загрузку информации о рейтингах. Поэтому все, что нужно — это задать представление для отображения формы с рейтингами с помощью вспомогательного класса рейтингов.
Страница просмотра адреса смотрится довольно пресно. Нужно как минимум добавить немного графики и элементов управления, чтобы посетители быстрее воспринимали информацию. Оставим сложности CSS и стилизации веб-мастерам, но немного упростим им задачу, показав иконки пользователя из информации о пользователя для каждого адреса. Для этого будем использовать вспомогательный класс gravatar плагина Goodies.
Откройте представление для адресов. Мы заменим строку:
Html->link($url[‘User’][‘id’], array(‘controller’ => ‘users’, ‘action’ => ‘view’,$url[‘User’][‘id’]));?>
на похожую, но включающую в себя вывод аватара с помощью вспомогательного класса:
Html->link(
$this->Gravatar->image($url[‘User’][’email’]),
array(‘controller’ => ‘users’, ‘action’ => ‘view’,
$url[‘User’][‘id’]),
array(‘escape’ => false));?>

Наконец, подключите вспомогательный класс в контроллере AppController в файле /app_controller.php:
class AppController extends Controller <
var $helpers=array(‘Html’,’Form’,’Sessions’,’Goodies.Gravatar’);
//.. existing code
>
Теперь будет отображаться граватар пользователя, полученный по его e-mail, указанному во время регистрации, а вместо уродливого UUID будет показано имя пользователя.
Давайте еще немного украсим дополнительную информацию, добавив возможность поделиться ссылкой в социальных сетях, чтобы привлечь больше посетителей на сайт. Этот функционал предоставляет модуль CakeSocial. В модуле есть вспомогательный класс «ShareThis», который очень сильно упрощает обмен контентом в социальных сетях. Добавляем вспомогательный класс в контроллер AppController в файле /app_controller.php:
class AppController extends Controller <
var $helpers=array(‘Html’,’Form’,’Sessions’,’Goodies.Gravatar’,’CakeSocial.ShareThis’);
//,,existing code
>
С разу перед закрывающим тегом в представлении для адресов /view/urls/view.php вставьте следующий код:
>
>
ShareThis->display();?>

В этом представлении пять строк, но только одна выводит ссылки на социальные сети. Остальное — метка и стили для обертки вывода. Обновите страницу и увидите, что ссылки на социальные сети ShareThis появились, и можно поделиться ссылкой в списке сервисов по умолчанию.
Приложение, которое у нас получилось, показывает, как быстро можно создавать код с CakePHP, и иллюстрирует качество свободных модулей. У приложение есть большой потенциал для расширения — предоставление дополнительной информации, например, частых URL-адресов, интеграция в сервис REST, Ajax-скриплет для работы с закладками, который можно встроить в браузер. Возможности CakePHP по истине безграничны!

Связи associated в Cake PHP 3.6

использую плагин CakeDC . хочу к таблице users привязать другую таблицу player_heroes . в редактирование профиля добавил поле

в action контроллера добавил

в Entity\Users.php прописал hasMany ( uid поле в таблице player_heroes )

После сохранения профиля таблица users обновляется, а player_heroes пуста. Может дело в путях? Users находится в vendor/cakedc/src/ , а PlayerHeroes в корне app/src/ . Никаких ошибок не выбивает

1 ответ 1

подытожу дискуссию в комментариях.

У нас имеется: таблицы Users и таблица Heroes и мы хотим связать их, так что бы при редактировании пользователя мы могли выбрать несколько значений heroes .

Данная связь описывается отношением многие-ко-многим , и реализуется с помощью belongsToMany . Согласно соглашениям об именовании в cakephp, таблица связи должна назыаться, используя имена связуемых таблицы в алфавитном порядке, и иметь ключи по названиям таблиц в единственном числе с суффиксом _id .

Таким образом, для реализации связи нужна таблица heroes_users с полями id, user_id, hero_id .

У вас же таблица связи ( players_heroes ) уже создана, и имеет структуру id, uid, heroid . Что заставляет нас вручную конфигурировать связь.

Помимо этого при использовании имен, не соответствующих принятым правилам именования, лишает вас возможности нормально генерировать классы таблицы и моделей с помощью cake bake model .

В итоге, требуется настроить таблицу Users следующим образом:

и теперь в шаблоне редактирования осталось вывести

где $heroes это список полученный с помощью

Приведенного кода достаточно для сохранения связей многие-ко-многим.

В дополнение, в приведенном вами коде фигурирует еще две вещи.

сущность PlayerHeroes . Для простого сохранения связи она не нужна. Необходимость в таком возникает, когда помимо самого факта выбора нужно хранить и доп. информацию. Например, кроме выбора важен еще и запомнить порядок, либо какого то героя пометить как favorites . Тогда таблица players_heroes дополняется новыми столбцами, создается отдельная сущность для этой таблицы, и при конфигурации добавляется опция through , указывающая а класс этой связующей таблицы.

associated в patchEntity . Опять же, для простого сохранения связи это не нужно. Этот параметр может использоваться когда мы, например, одновременно с сохранением связи, решим еще и переименовать героя.

CakePHP 3: Bake by example

Sep 14 ’18 ・4 min read

This article is aimed at newbies to the CakePHP 3 framework.

I’m a fan of CakePHP, and was completely new to it about 9 months ago. Any framework takes some getting used to, but my biggest issue with Cake 3 is the manual. I feel it is written very much with a feeling of «you’re familiar with Cake 2, so we don’t need explain as much with this one».

Once you get used to using the framework however, it is a very rewarding framework, and luckily the IRC channel and cakephp-3.x tag on stack overflow is actively maintained, so you can work it out or get an answer pretty quickly.

Rather than moan about the manual, I thought I would post an example-based guide to the code generation feature, to help any other new-to-cake devs out there.

These examples are deliberately simple, they’re just to get you started with the code generator, rather than just the basic list of commands currently available in the docs.

Before you use the bake command

  1. Create some tables, following CakePHP conventions
  2. Check you are in the root directory of your project, if you do a directory listing ls you should see folders «bin», «config», «src», «webroot»

Create a controller for a table called users

Create a model (and entity) for a table called users

creates src/Model/Table/UsersTable.php
creates src/Model/Entities/User.php

Create the default template files for a table (add/edit/view/index)

creates src/Template/Users/index.ctp add.ctp edit.ctp view.ctp

Bake all of the above in 1 command

Bake just the index template file

Baking for prefix folders (e.g. admin)

If you are baking for an admin section of your site, you will be using separate controller and template files

creates src/Template/Admin/Users/index.ctp edit.ctp add.ctp view.ctp

Bake from a different database

The previous examples all use the db connection defined in app.php as ‘default’ . If you have a legacy database for handling client records, e.g. db_records , your config file might look like this

Create a model for a table called user_records in the records database

creates /src/Model/Table/UserRecordsTable.php
creates /src/Model/Entities/UserRecord.php

This will include in your UserRecordsTable.php file

Create a model from this database for a table not following cake convention, e.g. tbl_records_user

creates /src/Model/Table/UserRecordsTable.php
creates /src/Model/Entities/UserRecord.php

This will add the defaultConnectionName() and also set

There are other options you can set here, but some are easier to set by editing the file afterwards. But for example, you can also set the display field to be something other than the default, e.g. email

This will modify the display field

Baking with a plugin

Assume you have installed a plugin such as friendsofcake/BootstrapUI so that your template files are using Bootstrap styles by default
You can now add -t BootstrapUI to any of the above commands

Create the template files using the plugin

creates /src/Template/Users/index.ctp add.ctp edit.ctp view.ctp

Create the whole MVC skeleton (controller, table, entity, templates) using the legacy database

Useful Features

Bake relies on the database connection, so to save you loading up and remembering all the tables in the system, you can call a command without specifying the table name to see a list of available tables. Let’s say your database has 3 tables:
users
articles
activity_logs

Using the command bin/cake bake model will produce a list of available tables

The same goes for:

Hopefully if you’re using CakePHP for the first time this is a useful reference for the bake console.

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих