BlogFriends.ru - 2. Генерация кода
BlogFriends.ru - 1. Схема сайта
Disclaimer: многие вещи в этом посте могут показаться очевидными для профессионалов, но уж слишком много я видел людей, использующих phpMyAdmin и "систему контроля версий" WinRAR.
Создание базы данных
После того, как мы продумали структуру базы данных, создадим её в MySQL. Cake позволяет добавлять любой префикс, что важно для shared hosting, так как там часто даётся только одна база данных в которую иногда надо вместить несколько приложений.
CREATE TABLE `blogfriends_blogs`( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT , `created` datetime DEFAULT NULL , `user_id` int(11) DEFAULT NULL , `url` varchar(1024) DEFAULT NULL , `name` varchar(1024) DEFAULT NULL , PRIMARY KEY (`id`)) TYPE=MyISAM; CREATE TABLE `blogfriends_posts`( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT , `dat` datetime DEFAULT NULL , `blog_id` int(11) DEFAULT NULL , `name` varchar(1024) DEFAULT NULL , `annotation` text DEFAULT NULL , PRIMARY KEY (`id`)) TYPE=MyISAM; CREATE TABLE `blogfriends_users`( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT , `created` datetime DEFAULT NULL , `login` varchar(255) DEFAULT NULL , `password` varchar(255) DEFAULT NULL , `email` varchar(255) DEFAULT NULL , `url` varchar(1024) DEFAULT NULL , `text_sidebar` longtext DEFAULT NULL , PRIMARY KEY (`id`)) TYPE=MyISAM;
Я делаю это в визуальном режиме, мне очень помогает Navicat. По-моему, это самая удобная программа для работы с MySQL. В ней создание структуры выглядит примерно так:

Вдобавок, очень радует её функция HTTP Tunnel. В суровых условиях shared hosting редко дают возможность напрямую подключиться к удалённой базе данных. В папке Navicat есть файл ntunnel_mysql.php, который можно загрузить на сервер и указав путь к нему, подключаться удалённо.
Получение последней версии CakePHP
Последние версии CakePHP довольно стабильны и в них постоянно появляются полезные возможности и исправляются ошибки, поэтому для можно использовать последний ночной билд. Его не всегда можно напрямую скачать с официального сайта, но можно получить по SVN.
Для этого надо установить TortoiseSVN и перезагрузиться. Создайте папку, в которой будет находиться последняя версия Cake, нажмите в ней правую кнопку мыши и выберите "SVN Checkout".

Введите URL of repository: https://svn.cakephp.org/repo/branches/1.2.x.x

Я люблю, когда у меня есть отдельно ядро Cake без лишних .svn файлов. У меня оно находится в c:\output\common\cake (c:\ouput - это корневая папка для Apache, вы используйте те пути, которые вам подходят). Я использую одну папку для большинства проектов на cake. Для того, чтобы получить такую папку, перетяните правой кнопкой мыши cake 1.2-night\cake в нужную папку (например, c:\output\common) и выберите "SVN Export to here".

Для создания нового проекта, точно так же перетяните папку cake 1.2-night\app в c:\output и переименуйте в blogfriends.ru.
Генерация кода
Философия CakePHP предусматривает всевозможное упрощение работы программиста, поэтому там есть "консоль", которая позволяет создавать каркас кода автоматически, ответив на несколько вопросов. Для того, чтобы удобнее было вызывать консоль, добавьте путь к ней в PATH.
Настройка подключения к базе данных
После этого запускайте Console2, перейдите с папку проекта и запускайте консоль и отвечайте на заданные вопросы. Если нет ответа, значит я выбирал ответ по умолчанию просто нажимая Enter.
Кстати, часто задают вопрос, как заставить CakePHP работать с русским языком. Проблема в том, что забывают указать кодировку таблицы cp1251, а по умолчанию ставится utf8. Наша база в UTF-8, поэтому можно не указывать кодировку.
После этого создадим модели, контроллеры и отображения. Если вы не знаете, что это, отвлекитесь и прочитайте http://cake-php.ru/basic_concepts
Создание моделей
Запустите ещё раз консоль:
C:\output\blogfriends.ru>cake bake
Welcome to CakePHP v1.2.0.5875 pre-beta Console
---------------------------------------------------------------
App : blogfriends.ru
Path: C:\output\blogfriends.ru
---------------------------------------------------------------
Interactive Bake Shell
---------------------------------------------------------------
[D]atabase Configuration
[M]odel
[V]iew
[C]ontroller
[P]roject
[Q]uit
What would you like to Bake? (D/M/V/C/P/Q)
> m
---------------------------------------------------------------
Model Bake:
---------------------------------------------------------------
Database Connection:
[default] >
Possible Models based on your current database:
1. Blog
2. Post
3. User
Enter a number from the list above, or type in the name of another model.
> 1
Would you like to supply validation criteria for the fields in your model? (y/n)
[y] >
Name: id
Type: integer
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.
... or enter in a valid regex validation string.
[5] > 3
Name: created
Type: datetime
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.
... or enter in a valid regex validation string.
[5] >
Name: user_id
Type: integer
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.
... or enter in a valid regex validation string.
[5] > 3
Name: url
Type: string
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.
... or enter in a valid regex validation string.
[5] > 1
Would you like to define model associations (hasMany, hasOne, belongsTo, etc.)?
(y/n)
[y] >
One moment while I try to detect any associations...
Done.
---------------------------------------------------------------
Please confirm the following associations:
---------------------------------------------------------------
Blog belongsTo User? (y/n)
[y] >
Blog hasOne Post? (y/n)
[y] > n
Blog hasMany Post? (y/n)
[y] > y
Would you like to define some additional model associations? (y/n)
[n] >
---------------------------------------------------------------
The following model will be created:
---------------------------------------------------------------
Model Name: Blog
DB Connection: default
DB Table: blogfriends_blogs
Validation: Array
(
[id] => VALID_NUMBER
[user_id] => VALID_NUMBER
[url] => VALID_NOT_EMPTY
)
Associations:
Blog belongsTo User
Blog hasMany Post
---------------------------------------------------------------
Look okay? (y/n)
[y] >
Creating file C:\output\blogfriends.ru\models\blog.php
Wrote C:\output\blogfriends.ru\models\blog.php
Baking unit test for Blog...
Creating file C:\output\blogfriends.ru\tests\cases\models\blog.test.php
Wrote C:\output\blogfriends.ru\tests\cases\models\blog.test.php
---------------------------------------------------------------
Interactive Bake Shell
---------------------------------------------------------------
[D]atabase Configuration
[M]odel
[V]iew
[C]ontroller
[P]roject
[Q]uit
What would you like to Bake? (D/M/V/C/P/Q)
> m
---------------------------------------------------------------
Model Bake:
---------------------------------------------------------------
Database Connection:
[default] >
Possible Models based on your current database:
1. Blog
2. Post
3. User
Enter a number from the list above, or type in the name of another model.
> 2
Would you like to supply validation criteria for the fields in your model? (y/n)
[y] >
Name: id
Type: integer
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.
... or enter in a valid regex validation string.
[5] > 3
Name: dat
Type: datetime
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.
... or enter in a valid regex validation string.
[5] >
Name: blog_id
Type: integer
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.
... or enter in a valid regex validation string.
[5] > 3
Name: name
Type: string
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.
... or enter in a valid regex validation string.
[5] >
Name: annotation
Type: text
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.
... or enter in a valid regex validation string.
[5] >
Would you like to define model associations (hasMany, hasOne, belongsTo, etc.)?
(y/n)
[y] >
One moment while I try to detect any associations...
Done.
---------------------------------------------------------------
Please confirm the following associations:
---------------------------------------------------------------
Post belongsTo Blog? (y/n)
[y] >
Would you like to define some additional model associations? (y/n)
[n] >
---------------------------------------------------------------
The following model will be created:
---------------------------------------------------------------
Model Name: Post
DB Connection: default
DB Table: blogfriends_posts
Validation: Array
(
[id] => VALID_NUMBER
[blog_id] => VALID_NUMBER
)
Associations:
Post belongsTo Blog
---------------------------------------------------------------
Look okay? (y/n)
[y] >
Creating file C:\output\blogfriends.ru\models\post.php
Wrote C:\output\blogfriends.ru\models\post.php
Baking unit test for Post...
Creating file C:\output\blogfriends.ru\tests\cases\models\post.test.php
Wrote C:\output\blogfriends.ru\tests\cases\models\post.test.php
---------------------------------------------------------------
Interactive Bake Shell
---------------------------------------------------------------
[D]atabase Configuration
[M]odel
[V]iew
[C]ontroller
[P]roject
[Q]uit
What would you like to Bake? (D/M/V/C/P/Q)
> m
---------------------------------------------------------------
Model Bake:
---------------------------------------------------------------
Database Connection:
[default] >
Possible Models based on your current database:
1. Blog
2. Post
3. User
Enter a number from the list above, or type in the name of another model.
> 3
Would you like to supply validation criteria for the fields in your model? (y/n)
[y] >
Name: id
Type: integer
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.
... or enter in a valid regex validation string.
[5] > 3
Name: created
Type: datetime
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.
... or enter in a valid regex validation string.
[5] >
Name: login
Type: string
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.
... or enter in a valid regex validation string.
[5] > 1
Name: password
Type: string
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.
... or enter in a valid regex validation string.
[5] > 1
Name: email
Type: string
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.
... or enter in a valid regex validation string.
[5] >
Name: url
Type: string
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.
... or enter in a valid regex validation string.
[5] >
Name: text_sidebar
Type: text
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.
... or enter in a valid regex validation string.
[5] >
Would you like to define model associations (hasMany, hasOne, belongsTo, etc.)?
(y/n)
[y] >
One moment while I try to detect any associations...
Done.
---------------------------------------------------------------
Please confirm the following associations:
---------------------------------------------------------------
User hasOne Blog? (y/n)
[y] > n
User hasMany Blog? (y/n)
[y] >
Would you like to define some additional model associations? (y/n)
[n] >
---------------------------------------------------------------
The following model will be created:
---------------------------------------------------------------
Model Name: User
DB Connection: default
DB Table: blogfriends_users
Validation: Array
(
[id] => VALID_NUMBER
[login] => VALID_NOT_EMPTY
[password] => VALID_NOT_EMPTY
)
Associations:
User hasMany Blog
---------------------------------------------------------------
Look okay? (y/n)
[y] >
Creating file C:\output\blogfriends.ru\models\user.php
Wrote C:\output\blogfriends.ru\models\user.php
Baking unit test for User...
Creating file C:\output\blogfriends.ru\tests\cases\models\user.test.php
Wrote C:\output\blogfriends.ru\tests\cases\models\user.test.php
---------------------------------------------------------------
Interactive Bake Shell
---------------------------------------------------------------
[D]atabase Configuration
[M]odel
[V]iew
[C]ontroller
[P]roject
[Q]uit
What would you like to Bake? (D/M/V/C/P/Q)
> q
Вроде бы всё понятно - вопросы задаются человеческим языком. Но, если это мне только кажется, отпишитесь в комментах. Замечания принимаются.
Создание контроллеров
C:\output\blogfriends.ru>cake bake
Welcome to CakePHP v1.2.0.5875 pre-beta Console
---------------------------------------------------------------
App : blogfriends.ru
Path: C:\output\blogfriends.ru
---------------------------------------------------------------
Interactive Bake Shell
---------------------------------------------------------------
[D]atabase Configuration
[M]odel
[V]iew
[C]ontroller
[P]roject
[Q]uit
What would you like to Bake? (D/M/V/C/P/Q)
> c
---------------------------------------------------------------
Controller Bake:
---------------------------------------------------------------
Possible Models based on your current database:
1. Blogs
2. Posts
3. Users
Enter a number from the list above, or type in the name of another controller.
> 1
Would you like bake to build your controller interactively?
Warning: Choosing no will overwrite Blogs controller if it exist. (y/n)
[y] >
Would you like to use scaffolding? (y/n)
[y] > n
Would you like to include some basic class methods (index(), add(), view(), edit
())? (y/n)
[n] > y
Would you like to create the methods for admin routing? (y/n)
[n] > y
Would you like this controller to use other models besides 'Blog'? (y/n)
[n] > n
Would you like this controller to use other helpers besides HtmlHelper and FormH
elper? (y/n)
[n] > n
Would you like this controller to use any components? (y/n)
[n] > n
Would you like to use Sessions? (y/n)
[y] > y
You need to enable Configure::write('Routing.admin','admin') in /config/core
.php to use admin routing.
What would you like the admin route to be?
Example: www.example.com/admin/controller
What would you like the admin route to be?
[admin] > admin
---------------------------------------------------------------
The following controller will be created:
---------------------------------------------------------------
Controller Name: Blogs
---------------------------------------------------------------
Look okay? (y/n)
[y] > y
Creating file C:\output\blogfriends.ru\controllers\blogs_controller.php
Wrote C:\output\blogfriends.ru\controllers\blogs_controller.php
Baking unit test for Blogs...
Creating file C:\output\blogfriends.ru\tests\cases\controllers\blogs_control
ler.test.php
Wrote C:\output\blogfriends.ru\tests\cases\controllers\blogs_controller.test
.php
---------------------------------------------------------------
Interactive Bake Shell
---------------------------------------------------------------
[D]atabase Configuration
[M]odel
[V]iew
[C]ontroller
[P]roject
[Q]uit
What would you like to Bake? (D/M/V/C/P/Q)
> q
Настоящий программист должен быть немного ленивым, поэтому вместо того, чтобы каждый раз давать одинаковые ответы, можно заранее ответить на все вопросы при вызове консоли.
C:\output\blogfriends.ru>cake bake controller posts y n y y n n n y Welcome to CakePHP v1.2.0.5875 pre-beta Console --------------------------------------------------------------- App : blogfriends.ru Path: C:\output\blogfriends.ru --------------------------------------------------------------- Creating file C:\output\blogfriends.ru\controllers\posts_controller.php Wrote C:\output\blogfriends.ru\controllers\posts_controller.php Baking unit test for Posts... Creating file C:\output\blogfriends.ru\tests\cases\controllers\posts_control ler.test.php Wrote C:\output\blogfriends.ru\tests\cases\controllers\posts_controller.test .php C:\output\blogfriends.ru>cake bake controller users y n y y n n n y Welcome to CakePHP v1.2.0.5875 pre-beta Console --------------------------------------------------------------- App : app Path: C:\output\blogfriends.ru --------------------------------------------------------------- Creating file C:\output\blogfriends.ru\controllers\users_controller.php Wrote C:\output\blogfriends.ru\controllers\users_controller.php Baking unit test for Users... Creating file C:\output\blogfriends.ru\tests\cases\controllers\users_control ler.test.php Wrote C:\output\blogfriends.ru\tests\cases\controllers\users_controller.test .php
Создание отображений
Тут вообще просто - cake bake view blogs, cake bake view posts, cake bake view users.
Итог
Фух… Что-то длинный получился пост, а я ещё хотел о маршрутизации запросов написать, но, наверное, уже в следующий раз. Постараюсь писать чаще несмотря на все дедлайны, так что подписывайтесь на RSS и отправляйте ссылку на сайт знакомым программистам.
Интересная статья. Для такого ламера в кейке как я, самое то. %-)
Отлично.
nightly у них как? Более-менее стабильные?
@Sam: Да, nightly довольно стабильные. Я для текущих проектов в разработке использую именно их.
[...] Продолжение Послать ссылку на этот обзор другу по ICQ или [...]
а как делать “bake” на серваке? через веб-морду возможно? или собирать локально и заливать на сервак необходимо? сорри за ламерство - только начинаю “печь” (и этот блог очень помогает, спасибо!)
@yoyurec: мне тоже сначала казалось, что это глупо - не иметь веб-интерфейса для bake. У меня было две фазы - development-сервер в локальной сети и production-сервер - в Интернете/Интранете клиентов. Естественно, если в проекте задействовано несколько программистов (верстальщики не считаются), то у каждого была своя подпапка с SVN и была общая - для релизов. Соответственно для того, чтобы сделать cake bake, надо было заходить под VNC (что-то вроде Remote Assistant, только лучше) и нервничать по поводу тормознутости удалённой консоли. У меня уже даже была идея создать свой web-интерфейс для bake.
А потом пришло озарение: установил локально Apache+PHP+MySQL и понял, что локально разрабатывать всё намнооого удобнее и вдобавок никто не ругается, если сделаешь вечный цикл и сервер зависнет. Поэтому мой совет - установи всё локально - избежишь кучи проблем. А с помощью нужных программ (SVN - для кода, Navicat - для MySQL) синхронизировать всё очень просто.
спасибо за ответ!
PS: не нашёл формы для контактов, так что отпишусь тут - в низу страницы (постраничная навигация блога) “Более новые заниси” написано, вместо…
@yoyurec: спасибо, исправил опечатку.
Что вроде Navicat посоветуете под лин?
@Антон Исайкин:
К сожалению, Unix-опыт у меня только консольный.
Здравствуйте! У меня просьба распишите подробней то, что касается cake bake и кнсоли. У меня консоль выдает
…>cake bake
“cake” не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Еще хорошо бы этот материал сделать в виде видеоурока. Это займет меньше времени, чем написание статьи, а визуализация будет потрясающая.
Спасибо за статью. С нетерпением жду продолжения.
Было бы неплохо описать процесс настройки SVN сервера.
Постучи мне в аську 551189. Есть пара вопросов
Привет, спасибо за посты.
Есть вопрос по сохранениям сессий, на этом блоге ничего кажется нету по этому поводу, какая у вас аська ( у меня 5573853 ) ?
проверяй на несуществующие картинки (img/net-takoj-kartinki.jpg)
при этом могут сбиваться сессии
у меня вот такой вопрос, стоит php 5.0 а можно cake`у сказать что я использую пхп 4?
я вот не могу найти где он гад проверяет это… может кто в курсе? ася 326-11-00
а какая ему разница?
cake 1.1 точно должен работать под PHP4 так же как и под PHP5
Вот в версии 1.2 bake запускается совсем не как в 1.1 . Я привык к bake, реально экономит кучу времени. Но вот в новой версии запустить его не могу. пытаюсь запустить как в 1.1 - пишет “Class ‘Shell’ not found”. Распишите подробнее как запустить bake.