MacにVagrant+VirtualBoxを入れて、CentOS+PHP7+MySQL+CakePHP3で公式チュートリアル→仮想の従業員マスタ

こんにちは。

野郎です。

ご無沙汰しております。

12月から年末年始とバタバタしまして、ブログなど書けませんでした。

久しぶりなんで、野郎はどんな野郎だったのか覚えていないよ。

前回の環境構築

チュートリアルをやってから数ヶ月経ち、記憶は薄れております。前回環境構築をしたので、とりあえず公式チュートリアルをやってみたのです。

手元にあるのは備忘録テキストファイルのみっす。前回同様、ほとんど編集せずにどぱーっと転記します。

PHP・・・・

転記の前に、初めてPHPを触った感想です。よくわからないというのが正直です。

えーと、野郎はJavaは一応資格を取った、C#で小さい業務アプリを何本か書いた、VBAだいぶ慣れた、GASをすこーしだけ触った、といった状況です。

連想配列とか触ったことなかったので、いまいちわかんなかったです。あと、変数宣言しないとか、HTMLに埋め込まれてるとか、値を受け渡すやり方とかが、まだピンとこないっす。

習うより慣れろってんでとにかく触ってました。

その後、チュートリアルはそこそこに止めて、いまはチュートリアルの内容をベースに改造した仮想の従業員マスタを作って、そこにじわじわ機能追加をしております。会社からそのように提案されたんだね。機能追加は現在もじわりじわりと継続中。けど、ホントはC#の勉強をしたい・・・。C#好き・・・。

022E815E F026 4B8F 8F52 95EE59A62CEA 1 105 c

チュートリアル→従業員マスタ作成

えーと、もう細かく内容を編集する余裕がないので、メモをほとんどそのまま転記しますー。

ーーーーーーー以下転機ーーーーーー

==============================================
ブログチュートリアル1
https://book.cakephp.org/3.0/ja/tutorials-and-examples/blog/blog.html
cake_blog データベースの作成
use cake_blog として切り替え
articlesの作成はできた

テストレコードが入らない
文字コード?(incorrect string value)
CentOS7にMySQL導入&初期設定をおこなう
http://vdeep.net/centos7-mysql

$ sudo vi /etc/my.cnf
character_set_server=utf8
skip-character-set-client-handshake
$ systemctl restart mysqld.service
+————————–+—————————-+
| Variable_name | Value |
+————————–+—————————-+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+————————–+—————————-+

OKっぽい
けど、入らないで同じエラー。列ごとに指定しなきゃいけないのかな。。。。
とりあえず全部英語で入れることにした。
入った!!!!!
チュートリアル1が終わったよ!!!

==============================
チュートリアル2
プロジェクトに移動してbakeコマンドを使用する
CakePHPでbakeコマンドを使用したフォーム作成とデータ保存
https://ajike.github.io/cakephp3-create-form/

コマンドが使えるのかチェック
bin/cake bake
articleのモデル作成
bin/cake bake model Articles

コードはまだ読めていない・・・。
PHPの書き方に慣れねば・・・。
==============================
チュートリアル3
composer.jsonにmigrationsの記述はあった
けど、pluginフォルダは空っぽだった
composer require CakePHP/migrations:~1.0
2.3.0が入ってたみたいなので、戻した
composer require CakePHP/migrations:2.3
エラーが出てる・・・
Package phpunit/phpunit-mock-objects is abandoned,
you should avoid using it. No replacement was suggested.
気にしないで続行してみる
bin/cake bake migration CreateArticles title:string body:text category_id:integer created modified
Application の bootstrap メソッドに $this->addPlugin(‘Migrations’); を追加

「テーブルの編集」の手前までやった。

==============================
会社の人が、練習で架空の従業員マスタを作ってみては?とのこと(20191031)。

日本語が使えるかの確認から。
テストDBにテスト用テーブルを作った
test OK
”テスト” OK
大丈夫日本語使える

新規プロジェクトを作り、ブログチュートリアルを改変して、マスタを作ってみる

いったんvagrant box のバックアップを取る
vagrant package default –output Centos7stable.box
(VM名はなにもしなければdefaultらしい)
「vagrant status」でわかる
**vagrantfileとは別々に保存するらしい
new project 作成
composer self-update && composer create-project –prefer-dist cakephp/app employee
↑はアップデートしてプロジェクト作成かと
やはりプラグインでエラー
composer create-project –no-plugins –prefer-dist cakephp/app
composer self-update && composer create-project –no-plugins –prefer-dist cakephp/app employee

cakephpの初期画面、DBでエラー
確かプロジェクトを進めたら大丈夫だと。。。。

DB: employee
table: employee
create table employee (
-> id int(10) not null auto_increment primary key,
-> name_kanji varchar(50) not null,
-> name_kana varchar(50) not null,
-> email varchar(255),
-> phone varchar(100),
-> address TEXT,
-> created DATETIME,
-> modified DATETIME
-> );
+————+————–+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+————+————–+——+—–+———+—————-+
| id | int(10) | NO | PRI | NULL | auto_increment |
| name_kanji | varchar(50) | NO | | NULL | |
| name_kana | varchar(50) | NO | | NULL | |
| email | varchar(255) | YES | | NULL | |
| phone | varchar(100) | YES | | NULL | |
| address | text | YES | | NULL | |
| created | datetime | YES | | NULL | |
| modified | datetime | YES | | NULL | |
+————+————–+——+—–+———+—————-+

テストデータを3レコード入れた
INSERT INTO employee (name_kanji, name_kana, email, phone, address, created)
VALUES (“小林”, “こばやし”, “abcd@gmail.com”, “0901234567”, “沖縄県宜野湾市”, NOW());
select * from employee;
+—-+————+————–+—————-+————+———————–+———————+———-+
| id | name_kanji | name_kana | email | phone | address | created | modified |
+—-+————+————–+—————-+————+———————–+———————+———-+
| 1 | 小林 | こばやし | abcd@gmail.com | 0901234567 | 沖縄県宜野湾市 | 2019-11-03 06:06:34 | NULL |
| 2 | 山田 | やまだ | aaaa@gmail.com | 09098765 | 東京都杉並区 | 2019-11-03 06:06:34 | NULL |
| 3 | 鈴木 | すずき | zzz@gmail.com | 0901111111 | 大阪府豊中市 | 2019-11-03 06:06:36 | NULL |
+—-+————+————–+—————-+————+———————–+———————+———-+

config/app.php 書き換え
‘username’ => ‘root’,
‘password’ => ‘******’,
‘database’ => ‘employee’,
cakephpの初期画面、DBでエラーが消えたよ!!

CakePHPのプロジェクト内で下記コマンドを実行
コマンドが使えるか?
bin/cake bake
OK

bin/cake bake model Employee
bakeコマンドを実行するなら手動でファイルは作らなくていいみたい

employee controllerの作成
bin/cake bake controller Employee

!!!!!!テーブル名等における複数形単数形問題でDBから作り直した。!!!!!!!!!!!

DB: employee_list

table: employees
command:
create table employees (
id int(5) not null auto_increment primary key,
name_kanji varchar(50) not null,
name_kana varchar(50) not null,
email varchar(100),
phone varchar(20),
address TEXT,
created DATETIME,
modified DATETIME,
remarks TEXT
);

+——————–+
| Database |
+——————–+
| information_schema |
| cake_blog |
| employee_list |
| mysql |
| performance_schema |
| test |
+——————–+
+————————-+
| Tables_in_employee_list |
+————————-+
| employees |
+————————-+
+————+————–+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+————+————–+——+—–+———+—————-+
| id | int(5) | NO | PRI | NULL | auto_increment |
| name_kanji | varchar(50) | NO | | NULL | |
| name_kana | varchar(50) | NO | | NULL | |
| email | varchar(100) | YES | | NULL | |
| phone | varchar(20) | YES | | NULL | |
| address | text | YES | | NULL | |
| created | datetime | YES | | NULL | |
| modified | datetime | YES | | NULL | |
| remarks | text | YES | | NULL | |
+————+————–+——+—–+———+—————-+
+—-+————+————–+—————+————-+———————–+———————+———-+——————–+
| id | name_kanji | name_kana | email | phone | address | created | modified | remarks |
+—-+————+————–+—————+————-+———————–+———————+———-+——————–+
| 1 | 小林 | こばやし | abc@gmail.com | 09012345678 | 沖縄県宜野湾市 | 2019-11-04 03:37:31 | NULL | 備考を書く |
| 2 | 山田 | やまだ | xyz@gmail.com | 09098765432 | 北海道札幌市 | 2019-11-04 03:37:31 | NULL | 備考を入れる |
| 3 | 佐藤 | 佐藤 | ghi@gmail.com | 09011112222 | 東京都杉並区 | 2019-11-04 03:37:32 | NULL | 備考をです |
+—-+————+————–+—————+————-+———————–+———————+———-+——————–+
new project 作成
composer self-update && composer create-project –no-plugins –prefer-dist cakephp/app employees

config/app.php 書き換え(table  ではなく、DB名)
Datasources
‘username’ => ‘root’,
‘password’ => ‘*******’,
‘database’ => ‘employee_list’,

model作成
bin/cake bake model Employees
→EmployeesTable.phpができた

controller作成
bin/cake bake controller Employees
→EmployeesController.phpができた

“paginate”を使えば、テーブルを数ページに分けて表示できそう
e.g. 表示件数を1とか2にすれば数件のレコードでもテスト可能ですな。

チュートリアル2まで終わった。
「戻る」ボタンを実装した。

===============================
チュートリアル3
migration fileの生成
bin/cake bake migration CreateFunctions parent_id:integer lft:integer[10] right:integer[10] function:string[100] description:string created modified

テーブルの作成
bin/cake migrations migrate
このプロセスで簡単にcakephpからDBにアクセスして新規テーブルが作れるということなのかも

ログイン: mysql -u root -p
===============
mySQLの設定
pw: ****
user:root
database: mysql
===============
???どこにもテーブルができていない・・・?

migration fileの生成のあと、ファイル名のYYYYMMDD部分を消していたのが原因だった。
書いていないプロセスであった。
+————————-+
| Tables_in_employee_list |
+————————-+
| employees |
| functions |
| phinxlog |
+————————-+
mysql> desc functions;
+————-+————–+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+————-+————–+——+—–+———+—————-+
| id | int(11) | NO | PRI | NULL | auto_increment |
| parent_id | int(11) | YES | | NULL | |
| lft | int(10) | NO | | NULL | |
| right | int(10) | NO | | NULL | |
| function | varchar(100) | NO | | NULL | |
| description | varchar(255) | NO | | NULL | |
| created | datetime | NO | | NULL | |
| modified | datetime | NO | | NULL | |
+————-+————–+——+—–+———+—————-+
できてたー!

テーブルを関連づける
src/Model/Table/EmployeesTable.php
$this->belongsTo(‘Categories’, [‘foreignKey’ => ‘category_id’,]);
関連ファイル生成
bin/cake bake all Functions
or
bin/cake bake model Categories
bin/cake bake controller Categories
bin/cake bake template Categories
エラー発生
Exception: syntax error, unexpected ‘Function’ (T_FUNCTION), expecting identifier (T_STRING) in [/var/www/html/employees/src/Model/Entity/Function.php, line 21]
コードを見るとエラーになっている
function って予約語だったのかな
生成されたファイル全部消した
tableも削除

cakePhpから削除してみる
bin/cake bake migration DropFunctions
こういうのできてた
public function change()
{
$table = $this->table(‘functions’);
$table->drop();
}
すげー。消せそうだ。
migrationの実行
bin/cake migrations migrate

using database employee_list

== 20191109065553 DropFunctions: migrating
== 20191109065553 DropFunctions: migrated 0.0107s
おぉ。消えていそうだ。

mysql> show tables;
+————————-+
| Tables_in_employee_list |
+————————-+
| employees |
| functions |
| phinxlog |
+————————-+
あれ?消えていない。

select * from phinxlog;
+—————-+—————–+———————+———————+————+
| version | migration_name | start_time | end_time | breakpoint |
+—————-+—————–+———————+———————+————+
| 20191109062746 | CreateFunctions | 2019-11-09 06:28:52 | 2019-11-09 06:28:52 | 0 |
| 20191109065553 | DropFunctions | 2019-11-09 06:57:11 | 2019-11-09 06:57:11 | 0 |
+—————-+—————–+———————+———————+————+
消したと書いてある・・・。
functions
functions
メソッドとテーブル名も、同じ文字列だな・・。

mysql> drop functions;
mysql> show tables;
+————————-+
| Tables_in_employee_list |
+————————-+
| employees |
| phinxlog |
+————————-+
消えている・・・。
なんなのか・・・。

今度はfunctions → positions
bin/cake bake migration CreatePositions parent_id:integer lft:integer[10] rght:integer[10] name:string[100] description:string created modified

config/Migrations 内に生成されたファイルを変更
parent_id フィールドを ‘null’ => false を ‘null’ => true に変更
migrationの実行
bin/cake migrations migrate

DBできたー。
+————————-+
| Tables_in_employee_list |
+————————-+
| employees |
| phinxlog |
| positions |
+————————-+

関連ファイル生成
bin/cake bake all Positions

エラーなく通りました!!!!
やはり予約語だったのでしょうか・・・。

たぶんチュートリアル3は、複数テーブルの利用だと思う。
メインテーブルも編集しなくては。
bin/cake bake migration AddAgeToEmployees position_id:integer?[11]

$table = $this->table(‘employees’);
$table->addColumn(‘position_id’, ‘integer’, [
‘default’ => null,
‘limit’ => 11,
‘null’ => false, // true → false
]);
$table->update();

bin/cake migrations migrate

mysql> desc employees;
+————-+————–+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+————-+————–+——+—–+———+—————-+
| id | int(5) | NO | PRI | NULL | auto_increment |
| name_kanji | varchar(50) | NO | | NULL | |
| name_kana | varchar(50) | NO | | NULL | |
| email | varchar(100) | YES | | NULL | |
| phone | varchar(20) | YES | | NULL | |
| address | text | YES | | NULL | |
| created | datetime | YES | | NULL | |
| modified | datetime | YES | | NULL | |
| remarks | text | YES | | NULL | |
| position_id | int(11) | NO | | NULL | |
+————-+————–+——+—–+———+—————-+
position_id の列が追加されている!
mysql> desc positions;
+————-+————–+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+————-+————–+——+—–+———+—————-+
| id | int(11) | NO | PRI | NULL | auto_increment |
| parent_id | int(11) | YES | | NULL | |
| lft | int(10) | NO | | NULL | |
| rght | int(10) | NO | | NULL | |
| name | varchar(100) | NO | | NULL | |
| description | varchar(255) | NO | | NULL | |
| created | datetime | NO | | NULL | |
| modified | datetime | NO | | NULL | |
+————-+————–+——+—–+———+—————-+

position の中身の入れ方がよくわからないので、直接入れた。

INSERT INTO positions (lft, rght, name, description, created, modified)
VALUES (“1”, “1”, “営業”, “売る人”, NOW(), NOW());
INSERT INTO positions (lft, rght, name, description, created, modified)
VALUES (“2”, “1”, “事務”, “事務方”, NOW(), NOW());
INSERT INTO positions (lft, rght, name, description, created, modified)
VALUES (“3”, “1”, “経理”, “お金”, NOW(), NOW());
INSERT INTO positions (lft, rght, name, description, created, modified)
VALUES (“4”, “1”, “技術”, “作る人”, NOW(), NOW());

ちょっとよくわからなくなってきた
手動でDBのテーブルなど削除
生成されたファイルなど削除

もとのプロジェクトで実行してみる
うーん。
いまいちよくわからない。保存できない。
チュートリアルとも完全一致じゃないしな・・・・。

いったん別のことをやることにした。
チュートリアルは休止!
=====================================

452BE849 6F38 47FC 8508 D964FB5A44EC 1 105 c
途中まで手をつけた従業員マスタ、まずはページングから
https://book.cakephp.org/3/ja/controllers/components/pagination.html
https://www.tuyano.com/index3?id=5436003&page=3
EmployeesControllerに追加
public $paginate = [
‘limit’ => 3,
‘order’ => [
‘Employee.id’ => ‘asc’
]
];
public function initialize()
{
parent::initialize();
$this->loadComponent(‘Paginator’);
}

public function index()
{
$employees = $this->paginate($this->Employees);

$employees = $this->Employees->find(‘all’);
$this->set(compact(‘employees’));
// ↓追加行
$this->set(‘employees’, $this->paginate());
}
おぉ。3行ごとに表示された!

index.ctp に追記
縦に並んで表示されたけど、ちゃんと動く!

EmployeesControllerに追加

public $helpers = [ ‘Paginator’ => [‘templates’ => ‘paginator-templates’] ]; config/paginator-templates.php

を追加 縦に並んで表示された! ヒャッホー!

==============質問せねば

レコードが0件の時の処理 isset empty null 全部で1が返ってくる。

$this->set(‘msg’, $employees) 中身を表示させたら、レコードがあってもなくてもSQLが出てきた・・・?

foreach ($employees as $counter) { $counter++; }

たくさんレコードが表示されているのに、counter = 1だったよ・・・ よくわからないけど、別途ループを回したら数えられた。。。。どういうことなのか。。。。。 別途ループを回してレコード数を取得した。 もっといいやり方はないのかな。

とにかく検索機能はできた!

以前よりもPHPの書き方とか、ファイルとか、変数の持ち方(viuewとコントローラーで共通のものとか)の見通しがつくようになった気がする。

=============================

ログインを実装しようかなー。
権限を分けて、できることとか変えられたらベターかと。

migrate ファイルを生成
bin/cake bake migration CreateUsers username:string password:string email:string:unique:EMAIL_INDEX role:integer[1]:indexType:indexRole last_login_at created modified

migrateの実行
bin/cake migrations migrate

usersテーブルができてたー。

Database changed
mysql> show tables;
+————————-+
| Tables_in_employee_list |
+————————-+
| employees |
| phinxlog |
| users |
+————————-+
3 rows in set (0.00 sec)

mysql> desc users;
+—————+————–+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+—————+————–+——+—–+———+—————-+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | varchar(255) | NO | | NULL | |
| password | varchar(255) | NO | | NULL | |
| email | varchar(255) | NO | UNI | NULL | |
| role | int(1) | NO | MUL | NULL | |
| last_login_at | datetime | NO | | NULL | |
| created | datetime | NO | | NULL | |
| modified | datetime | NO | | NULL | |
+—————+————–+——+—–+———+—————-+
8 rows in set (0.00 sec)

usersテーブルのモデルを生成
bin/cake bake model Users

usersコントローラを生成
bin/cake bake controller Users

テンプレートを生成する
bin/cake bake template Users

このあたりのbakeは個別にやってるけど、前にやった時はbake all みたいな感じにやった気がする。

ログインもいいけど、みたことある機能をどんどん実装してみては?とのことなので方針変更。jqueryとかajaxだとか。。。。カレンダーで日付の入力とか、写真の取り扱いとか、住所に連動してレストランとかホテルとか郵便番号が表示されるとか、架空の従業員マスタをもとに、どんどん機能追加してみて、とのこと。

それではそのようにー。

============================

日付を入力して、それをもとに何かしてみよう。

誕生日列を追加
+————+————–+——+—–+———+—————-+
| id | int(5) | NO | PRI | NULL | auto_increment |
| name_kanji | varchar(50) | NO | | NULL | |
| name_kana | varchar(50) | NO | | NULL | |
| email | varchar(100) | YES | | NULL | |
| phone | varchar(20) | YES | | NULL | |
| address | text | YES | | NULL | |
| created | datetime | YES | | NULL | |
| modified | datetime | YES | | NULL | |
| remarks | text | YES | | NULL | |
+————+————–+——+—–+———+—————-+

ALTER TABLE employees add birthDay DATE AFTER address;

+————+————–+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+————+————–+——+—–+———+—————-+
| id | int(5) | NO | PRI | NULL | auto_increment |
| name_kanji | varchar(50) | NO | | NULL | |
| name_kana | varchar(50) | NO | | NULL | |
| email | varchar(100) | YES | | NULL | |
| phone | varchar(20) | YES | | NULL | |
| address | text | YES | | NULL | |
| birthDay | date | YES | | NULL | |
| created | datetime | YES | | NULL | |
| modified | datetime | YES | | NULL | |
| remarks | text | YES | | NULL | |
+————+————–+——+—–+———+—————-+

add.ctp, edit.ctpの先頭に追加:
<?= $this->Html->css(‘//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css’,[‘block’ => true]) ?>
<?= $this->Html->script(‘//code.jquery.com/jquery-1.12.4.js’,[‘block’ => true]) ?>
<?= $this->Html->script(‘//code.jquery.com/ui/1.12.1/jquery-ui.js’,[‘block’ => true]) ?>
<?= $this->Html->scriptStart([‘block’ => true]) ?>
$( function() {
$( “#datepicker” ).datepicker();
} );
<?= $this->Html->scriptEnd() ?>

// デフォルト状態
echo $this->Form->control(‘topics_date’);
// DatePickerの処理を追記した状態
echo $this->Form->control(‘topics_date’,[“type”=>”text”,”label”=>”日付”,”id”=>”datepicker”]);

0E0CB32E E096 4320 97B2 0C90F6B00739 1 105 c

ーーーーーーー転機終了ーーーーーー

これは少し前の話で、いまはもう少し進んだ。

たしか、

・各ビューを整えた

・jqueryでカレンダーを表示して年月日の保存

・保存した年月日をもとに年齢を算出して表示

とかやった気がする。

jqueryで写真の見た目がウルトラ簡単に変えられるのに驚いた。

写真をアップロードして表示をやろうと思ったけど、結構面倒のようだ・・・。次はajax(スペル忘れた)とかでYahooのAPIとか使ってなんかやってみようと思ってるけど、時間が・・・。うおぉぉぉ。

スポンサーリンク
スポンサードリンク




スポンサードリンク




シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
スポンサードリンク