cakephp2 – database.phpの情報でmysqlのpdoで接続する

cakephp2で、database.phpの情報でmysqlのpdoで接続する方法。

下記で、database.phpで設定している内容を取得できる。

include_once APP.'Config'.DS.'database.php';
if(class_exists('DATABASE_CONFIG'))
{
    $this->db_config = new DATABASE_CONFIG();
}

下記で、dbに接続できる。

private function connect_db()
{
    try
    {
        $this->pdo = new PDO('mysql:host='.$this->db_config->default['host'].';dbname='.
                             $this->db_config->default['database'].';charset=utf8',
                             $this->db_config->default['login'], $this->db_config->default['password']);
    }
    catch(PDOException $e)
    {
        exit('データベース接続失敗。'.$e->getMessage());
    }
}

下記で、データベースに存在するテーブルをすべて削除できる。

private function drop_tables()
{
    try
    {
        $stmt = $this->pdo->query('SHOW TABLES');
        $tables = $stmt->fetchAll();
        foreach($tables as $tbl)
        {
            $this->pdo->exec('drop table if exists '.$tbl[0]);
        }
    }
    catch(PDOException $e)
    {
        exit('テーブル削除失敗。'.$e->getMessage());
    }
}

下記で、データベースにsqlをインポートできる。

private function import_sql()
{
    $sql = $this->get_sql();
    try
    {
        return $this->pdo->exec($sql);
    }
    catch(PDOException $e)
    {
        exit('sqlインポート失敗。'.$e->getMessage());
    }
}
private function get_sql()
{
    try
    {
        return file_get_contents($this->sql_path);
    }
    catch(Exception $e)
    {
        exit('sqlファイル取得失敗。'.$e->getMessage());
    }
}

cakephp3 – Bake

composerでインストール

$ composer require --dev cakephp/bake:~1.0
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Writing lock file
Generating autoload files
> Cake\Composer\Installer\PluginInstaller::postAutoloadDump

bake

下記のような感じでbakeできる。2と特段変わらない。

$bin/cake bake model users
$bin/cake bake controller users
$bin/cake bake template users

mac – El CapitanでcakePHP3を使う

Macの状態

  • macは、El Capitan 11.10.5です。
  • すでに、PHP7、MySQL、Nginxが入っています。composerもインストール済みです。
  • Nginxのドキュメントルートは、/usr/local/var/wwwです。

cakephp3のプロジェクトを作成する

ドキュメントルートに移動して、hogeプロジェクトを作成します。

$ cd /usr/local/var/www
$ composer self-update && composer create-project --prefer-dist cakephp/app hoge

php-fpmが変だったので直した

cakePHP3は、php5.5.9以上が必要で、php7もOKということで、php7をインストールしました。しかしphp-fpmのバージョンを確認すると、以前インストールされていたphp5.3のものでした。

php7のインストールは、 mac – phpを7.0にバージョンアップに記載の方法でやりました。php7のパスは、/usr/local/php5/binです。これに対応するphp-fpmは、/usr/local/php5/sbin/php-fpmです。なので、/usr/local/php5/sbinもパスに加えたらOKになりました。

.bash_profileを開く

$ vim ~/.bash_profile

下記を最後に追加する

#php7
PATH=/usr/local/php5/bin:$PATH
PATH=/usr/local/php5/sbin:$PATH

.bash_profileを読み込む

$ source ~/.bash_profile

php-fpmを起動

$ php-fpm

php-fpmのバージョン確認

$ php-fpm -v
PHP 7.0.6 (fpm-fcgi) (built: May 24 2016 23:07:56)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
    with Xdebug v2.4.0RC3, Copyright (c) 2002-2015, by Derick Rethans

Nginxの設定をcakephpに合わせて変更する

nginx.confを修正する

#user  nobody;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {
        listen   8080;
        server_name www.localhost;
        rewrite ^(.*) http://localhost$1 permanent;
    }

    server {
        listen   8080;
        server_name localhost;

        # root directive should be global
        root   /usr/local/var/www/hoge/webroot/;
        index  index.php;

        access_log /usr/local/var/log/access.log;
        error_log /usr/local/var/log/error.log;

        location / {
            try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
            try_files $uri =404;
            include /usr/local/etc/nginx/fastcgi_params;
            fastcgi_pass    127.0.0.1:9000;
            fastcgi_index   index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    }
}

Nginxを再起動する

$ nginx -s reload

cloud9でcakephp3・MySQLを使う

cloud9プロジェクトの作成

cloud9でPHPを選択してプロジェクトを作ります。

MySQLの起動

$ mysql-ctl start
Installing MySQL
 * Stopping MySQL database server mysqld
   ...done.
 * Starting MySQL database server mysqld
   ...done.
 * Checking for tables which need an upgrade, are corrupt or were 
not closed cleanly.

MySQL 5.5 database added.  Please make note of these credentials:

       Root User: hgoe
   Database Name: hoge

 * Starting MySQL database server mysqld
   ...done.

phpMyAdminのインストール

$ phpmyadmin-ctl install
Starting installation
Starting MySQL
 * Starting MySQL database server mysqld
   ...done.
Configuring database
Starting apache
 * Restarting web server apache2
   ...done.
PHPMyAdmin Installation complete. You can log in at: https://hoge-hoge.c9users.io/phpmyadmin with the following username (and blank password):

       Username: hoge

上記URLにアクセスしたらphpMyAdminが表示される。初期ではusernameと、パスワード空で入れる。root以外のユーザを作成したりする。

composerのインストール

$ curl -sS https://getcomposer.org/installer | php
Downloading 1.1.1...

Composer successfully installed to: /home/ubuntu/workspace/composer.phar
Use it: php composer.phar
Some settings on your machine may cause stability issues with Composer.
If you encounter issues, try to change the following:

The xdebug extension is loaded, this can slow down Composer a little.
Disabling it when using Composer is recommended.

composerを移動する

$ sudo mv composer.phar /usr/local/bin/composer

cakeプロジェクトの作成

$ composer create-project cakephp/app caketest
You are running composer with xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug

Installing cakephp/app (3.2.6)
  - Installing cakephp/app (3.2.6)
    Downloading: 100%         

Created project in caketest
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing aura/installer-default (1.0.0)
    Downloading: 100%         

  - Installing cakephp/plugin-installer (0.0.15)
    Downloading: 100%         

  - Installing psr/log (1.0.0)
    Downloading: 100%         

  - Installing mobiledetect/mobiledetectlib (2.8.22)
    Downloading: 100%         

  - Installing aura/intl (1.1.1)
    Downloading: 100%         

  - Installing cakephp/chronos (0.4.9)
    Downloading: 100%         

  - Installing cakephp/cakephp (3.2.9)
    Downloading: 100%         

  - Installing symfony/yaml (v3.0.6)
    Downloading: 100%         

  - Installing symfony/filesystem (v3.0.6)
    Downloading: 100%         

  - Installing symfony/config (v3.0.6)
    Downloading: 100%         

  - Installing symfony/polyfill-mbstring (v1.2.0)
    Downloading: 100%         

  - Installing symfony/console (v3.0.6)
    Downloading: 100%         

  - Installing robmorgan/phinx (v0.5.3)
    Downloading: 100%         

  - Installing cakephp/migrations (1.6.1)
    Downloading: 100%         

  - Installing jakub-onderka/php-console-color (0.1)
    Downloading: 100%         

  - Installing jakub-onderka/php-console-highlighter (v0.3.2)
    Downloading: 100%         

  - Installing dnoegel/php-xdg-base-dir (0.1)
    Downloading: 100%         

  - Installing nikic/php-parser (v2.1.0)
    Downloading: 100%         

  - Installing symfony/var-dumper (v3.0.6)
    Downloading: 100%         

  - Installing psy/psysh (v0.7.2)
    Downloading: 100%         

  - Installing jdorn/sql-formatter (v1.2.17)
    Downloading: 100%         

  - Installing cakephp/debug_kit (3.2.8)
    Downloading: 100%         

  - Installing cakephp/bake (1.2.4)
    Downloading: 100%         

cakephp/app suggests installing phpunit/phpunit (Allows automated tests to be run without system-wide install.)
cakephp/app suggests installing cakephp/cakephp-codesniffer (Allows to check the code against the coding standards used in CakePHP.)
symfony/console suggests installing symfony/event-dispatcher ()
symfony/console suggests installing symfony/process ()
symfony/var-dumper suggests installing ext-symfony_debug ()
psy/psysh suggests installing ext-pdo-sqlite (The doc command requires SQLite to work.)
cakephp/debug_kit suggests installing ext-sqlite (DebugKit needs to store panel data in a database. SQLite is simple and easy to use.)
Writing lock file
Generating autoload files
> Cake\Composer\Installer\PluginInstaller::postAutoloadDump
> App\Console\Installer::postInstall
Created `config/app.php` file
Set Folder Permissions ? (Default to Y) [Y,n]? Permissions set on /home/ubuntu/workspace/caketest/tmp/cache
Permissions set on /home/ubuntu/workspace/caketest/tmp/cache/models
Permissions set on /home/ubuntu/workspace/caketest/tmp/cache/persistent
Permissions set on /home/ubuntu/workspace/caketest/tmp/cache/views
Permissions set on /home/ubuntu/workspace/caketest/tmp/sessions
Permissions set on /home/ubuntu/workspace/caketest/tmp/tests
Permissions set on /home/ubuntu/workspace/caketest/tmp
Permissions set on /home/ubuntu/workspace/caketest/logs
Updated Security.salt value in config/app.php

プレビューを見る

cloud9のメニューのPreviewからプレビューを開く。database.phpの設定がまだだが、とりあえず初期画面が表示される。

cake3

database.phpの設定

config/app.phpの229行目に下記があるので、修正する。

'username' => 'hoge',
'password' => 'hoge',
'database' => 'hoge',
'encoding' => 'utf8',
'timezone' => 'UTC',
'flags' => [],
'cacheMetadata' => true,
'log' => false,

cakephp2 – csvダウンロード

CsvHelperがあります。
https://github.com/dai199/cakephp-csv-helper

書き方は、下記のような感じになります。(上記GitHubの使い方の説明を引用)

<?php
$this->Csv->addRow($th);
foreach($td as $t) {
    $this->Csv->addField($t['User']);
    // .... 行を追加していく
    $this->Csv->endRow();
}
$this->Csv->setFilename($filename);
// 文字化けの場合は echo $this->Csv->render(true, 'sjis', 'utf-8');
echo $this->Csv->render();

これは、ここに記載している内容と基本同じようです。下記記載のリンクからヘルパーのファイルにたどり着かなかったので、再度投稿します。
http://endoyuta.com/2014/04/28/cakephp-csv%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC/

あと、このプラグインのCsvHelper.phpの28行目が、下記のようになっていて、$rowがありませんエラーが出ていたので、$rowを追加する必要があると思った。

function addRow() {
    fputcsv($this->buffer, $row, $this->delimiter, $this->enclosure);
}

あと、下記コードを書いたら文字化けした。
echo $this->Csv->render(true, ‘sjis’, ‘utf-8’);

cakePHP – Shellでコンポーネントを使う

参考:[CakePHP 2.x] shell(シェル)からComponent(コンポーネント)を呼び出す

<?php
App::uses('ComponentCollection', 'Controller');
App::uses('MailComponent', 'Controller/Component');

class MailJobShell extends AppShell
{
	public function startup(){
		$collection = new ComponentCollection();
		$this->Mail = new MailComponent($collection);
		parent::startup();
	}

cakephp – サブドメインとオリジナルドメインでcookieを有効にする

core.phpで、下記のようにやってみた。できてるっぽい。

$http_host = env('HTTP_HOST');
if(strstr($http_host, 'hoge.com')){
	$cookie_domain = '.hoge.com' ;
}else{
	$cookie_domain = '.' . $http_host;
}

Configure::write( 'Session', array(
	'defaults' => 'database',
	'timeout' => 1440,
	'handler' => array(
		'engine' => 'ComboSession',
		'model' => 'Session',
		'cache' => 'default'
	),
	'autoRegenerate' => true,
	'ini' => array(
		'session.cookie_domain' => $cookie_domain,
		'session.cookie_secure' => false,
	)
) );

cakephp – Migrationsプラグインでエラーになった場合の対処について

Migrationsプラグインは便利なのですが、エラーがでるとわけわからなくなります。一度エラーがでるとMigrationsフィアルが空っぽになったりします。テーブルを削除して、Migrations.migration generate -fとやると、削除したテーブルが存在しないよエラーが出たりします。何なんでしょうか?ただいまこれにより、混乱中です。

Migrationsプラグインは、https://github.com/CakeDC/migrationsにあります。ここにドキュメントもあるので、読んで整理します。

まず、テーブルを削除したときにgenerateするとエラーになるというのは勘弁していただきたいです。
Comparing schema.php to the database…のあとにエラーになります。現在のschema.phpと、現状のDBの状態を比較しようとするときにテーブル自体が存在しないとエラーがでるようです。これを回避する方法はあるのでしょうか?比較しなければいいとは思いますが、その場合、自動的にマイグレーションファイルが作成されることはございません。

-fというのは、モデルがなくても適用したい場合に使うようです。モデルが存在している状態でテーブルを削除するとエラーがでるのかもしれません。テーブルを削除する場合はモデルを削除してからgenerateする必要があるのかもしれません。本当でしょうか?キャッシュが残ってるとモデルが存在するのにテーブルがないのでエラーを出すのかもしれません。今すでにモデルを削除しておりますが、テーブルがないよエラーが出ていたのですが、キャッシュを削除するとエラーがでなくなりました。。記載している内容がどこまで正確かわかりませんが、また同じ問題が起こったときの参考に、これを残しておきます。

次に、なんで空っぽのmigrationsファイルが作成されたのでしょうか?これももしかしたらキャッシュの問題なのかもしれません。当然schema.phpを比較している状態だったのですが、空っぽになりました。とりえあず、Migrationファイルを作成するときは、削除するテーブルのモデルも削除し、キャッシュも削除してから作成するのが安全そうだと思いました。-fはモデルの作成が不要なテーブルもマイグレーションで管理したい場合に利用するものになるというのも覚えておけば、混乱が少なくなるかなと思いました。

ちなみに、cake Migrations.migration run resetとやると、テーブル構成が最初の最初に戻りますのでデータ全部消えますので、ご注意ください。

vagrant + chefでcakePHP3の環境をつくる

Vagrantのcentos6.5.3に、php5.6、apache2.2、mysql5.6、phpmyadmin、vim、gitをchefで自動的に入れます。

macにvagrantはインストール済みであるものとします。
chefのknife-soloと、Berkshelfもインストール済みの状態とします。

作成した、Vagrantfile、chef-repoは、下記のgithubにpushしました。
https://github.com/endoyuta/vagrant_contos65_cakephp3/tree/php5.6

php5.6ブランチが、php5.6やphpmyadminがインストールできて、cakephp3をインストールした際に出たエラーなども若干対応したものになります。

まず、~/vagrant/test内に、新たにvagrantを立ち上げます。

$ cd ~/vagrant
$ mkdir test
$ cd test
$ vagrant init

これで~/vagrant/test内に、Vagrantfileが作成されます。

BOXは、下記のCentOSの6.5.3を使います。
https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box

Vagrantfileを編集します。

$ vim Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos6.5.3"
  config.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.synced_folder "./", "/vagrant", mount_options: ['dmode=777', 'fmode=666']
end

vagrantを立ち上げます。

$ vagrant up

次にchefのセットをしていきます。
とりあえず、sshのconfigを設定しておきます。

$ vim ~/.ssh/config

Host 192.168.33.*
  IdentityFile ~/.vagrant.d/insecure_private_key
  User vagrant

chefのリポジトリをつくります。

$ knife solo init chef-repo

chef-soloをvagrantにインストールします。

$ cd chef-repo
$ knife solo prepare 192.168.33.10

次に、Berkshelfを使って、cookbookを作ります。

$ vim Berksfile

site :opscode cookbook 'mysql', '~> 5.3.6' cookbook 'vim' cookbook 'git' cookbook 'openssl'

cookbookを作成します。

$ berks vendor site-cookbooks

phpと、httpd、phpmyadminについては、berkshelfだと中々上手くいきませんでした。phpは、5.3までならすんなり入りますし、httpdも勝手にインストールされます。httpdとphpmyadminはエラーが続いたのでberkshelfはやめました。代わりに、vargrant+chefでつくるPHP5.5+MySQL5.6+CakePHP3環境を参考に、baseとphp55とphp56というcookbookをつくりました。baseとphp55は参考サイトをほぼそのまま使わせてもらってます。

次に、jsonファイルを編集します。

$ vim nodes/192.168.33.10.json

{
  "run_list": [
    "recipe[base]",
    "recipe[php56]",
    "recipe[mysql::server]",
    "recipe[mysql::client]",
    "recipe[vim]",
    "recipe[git]",
    "recipe[openssl]"
  ],
  "automatic": {
    "ipaddress": "192.168.33.10"
  },
  "mysql": {
    "version":"5.6",
    "port":"3306",
    "server_root_password":"vagrant",
    "remove_anonymous_users":true
  },
  "httpd": {
    "port": "80",
    "docroot": "/var/www/app/webroot"
  },
  "php": {
    "timezone": "Asia/Tokyo"
  }
}

chefを実行します。

$ knife solo cook 192.168.33.10

■参考
vargrant+chefでつくるPHP5.5+MySQL5.6+CakePHP3環境
Chef-Solo + Berkshelf で Rails 4 の開発環境を構築
chef-solo(knife)でMySQLサーバ5.6をインストールする 2014年度版
cakePHP3にチャレンジ!
https://supermarket.chef.io/
CentOSにPHP5.6をインストール

cakephp – viewでレイアウト変数を変更する

例えば、headerのtitleを変更したい場合、
View/Layouts/default.ctpのtitleタグ内を下記のようにする。

<?php
echo SITE_TITLE;
echo $this->fetch('title');
?>

そして、view内に下記を追記すると、サイト名 – ログインというtitleになる。

<?php $this->assign('title', ' - ログイン'); ?>

cakephp1.3 – SSL接続

1.3の場合セキュリティコンポーネントが微妙な挙動をするらしく、使わずにSSL接続や、CSRF対策などをやることが多いらしい。
SSL接続は、SSLコンポーネントというものが便利らしい。

SSL Component

簡単に設定できた。常時SSL接続の場合の設定方法はよくわからないが、本体ソースのssled関数で全部trueを返すようにしたらとりあえずできる。

参考:CakePHPのSSL Componentでhttpとhttpsを切り替える

cakePHP2 404エラーが発生したらリダイレクトさせる

参考:CakePHP2.Xで404 Not Foundエラーをリダイレクトする方法

上記のとおりやってるんだけどエラーになる。

Fatal Error (1): Call to undefined method AppExceptionRenderer::redirect()

$this->controller->redirect(‘/’);にしたらできた。