ComposerでCakephpにphpunitとdebugkitを入れてみる

ComposerでCakephpを入れてみたの続きです

phpunitとdebugkitを入れてみます

github上の
https://github.com/cakephp/cakephp/blob/master/composer.json
のcompoer.jsonをcakephpのディレクトリに保存します
(projectの下で、前回の続きだと「app」の中)

$ composer install
でphpunitとdebugkitが入ります

autoloaderの読み込み先を修正
$ vim Config/bootstrap.php

require ROOT . DS . APP_DIR . '/vendor/autoload.php';

phpunitが動くか確認します

http://(cakephpへのアクセス)/test.php
へブラウザでアクセス

cakephp-test

とでれば、うまくいってます

DebugKitの設定をします

$ vim Core/bootstrap.php

CakePlugin::load('DebugKit');       

を追記

$ vim Controller/AppController.php

class AppController extends Controller {
    public $components = array('DebugKit.Toolbar');                                                                                                                                                         
}

とcomponentを読み込みます
これですべての画面で有効になります

トップ画面にブラウザへアクセスして

cakephp-allgreen

オールグリーン!
で設定できました

ComposerでいれたCakephpを動かしてみる

ComposerでCakephpとPHPUnitを入れてみたの続きです

bake でプロジェクトを作ります
プロジェクト名はappにしました

/home/user/ws/vagrant/precise/cakephp/
がカレントディレクトリのときの実行結果です

$ Vendor/bin/cake bake project app

Welcome to CakePHP v2.6.1 Console
---------------------------------------------------------------
App : cakephp
Path: /home/user/ws/vagrant/precise/cakephp/
---------------------------------------------------------------
Skel Directory: /home/user/ws/vagrant/precise/cakephp/Vendor/cakephp/cakephp/lib/Cake/Console/Templates/skel
Will be copied to: /home/user/ws/vagrant/precise/cakephp/app
---------------------------------------------------------------
Look okay? (y/n/q) 
[y] > y
---------------------------------------------------------------
Created: app in /home/user/ws/vagrant/precise/cakephp/app
---------------------------------------------------------------
 * Random hash key created for 'Security.salt'
 * Random seed created for 'Security.cipherSeed'
 * Cache prefix set
 * app/Console/cake.php path set.
CakePHP is not on your `include_path`, CAKE_CORE_INCLUDE_PATH will be hard coded.
You can fix this by adding CakePHP to your `include_path`.
 * CAKE_CORE_INCLUDE_PATH set to /home/user/ws/vagrant/precise/cakephp/Vendor/cakephp/cakephp/lib in webroot/index.php
 * CAKE_CORE_INCLUDE_PATH set to /home/user/ws/vagrant/precise/cakephp/Vendor/cakephp/cakephp/lib in webroot/test.php
   * Remember to check these values after moving to production server
Project baked successfully!

Security.saltとSecurity.cipherSeedは勝手に生成してくれるようです

CAKE_CORE_INCLUDE_PATHを変えます

$ vim app/webroot/index.php

define('CAKE_CORE_INCLUDE_PATH',  ROOT . DS . 'Vendor' . DS . 'cakephp' . DS . 'cakephp' . DS . 'lib');

autoloaderを調整します

$ vim app/Config/bootstrap.php

// composerのautoloadを読み込み
require ROOT . DS . 'Vendor/autoload.php';

// CakePHPのオートローダーをいったん削除し、composerより先に評価されるように先頭に追加する
// https://github.com/composer/composer/commit/c80cb76b9b5082ecc3e5b53b1050f76bb27b127b を参照
spl_autoload_unregister(array('App', 'load'));
spl_autoload_register(array('App', 'load'), true, true);

ROOTが作成したappの一つ上、DSはDIRECTORY_SEPARATORで、ディレクトリの区切り文字です

データベースを用意します
mysqlを入れていたので、cakephpという名前でcreate databaseしておいて
設定ファイルのベースをコピー
$ cp app/Config/database.php.default
$ vim app/Config/database.php

データベース名、データベースユーザー、パスワードを変更します

で、画面にアクセスすると
cakephp-top

DebugKitを入れてない他はクリアしました

参考:
Cakephpでルーティングが動かない!? – bgbgbg

CakephpのCakeResponseで日本語名ファイルをダウンロードできない

cakephp 2.5.3での出来事です

public function download($path)
{
    // レイアウトの無効
    $this->autoRender = false;
    if( file_exists($fileName) === TRUE )
    {
        $this->response->file($path);
        $this->response->download(basename($path));
        return $this->response;
    }
}

なんてすれば、ファイルダウンロードできるはずが
404エラーになる..

ソースコードを追うと

//lib/Cake/Network/CakeResponse.php L1347
    $file = new File($path);
if (!$file->exists() || !$file->readable()) {
    if (Configure::read('debug')) {
        throw new NotFoundException(__d('cake_dev', 'The requested file %s was not found or not readable', $path));
    }
    throw new NotFoundException(__d('cake', 'The requested file was not found'));
}

if (!$file->exists() || !$file->readable()) {
でエラーに

Fileモデルを追っていると

//lib/Cake/Utility/File.php L86
public function __construct($path, $create = false, $mode = 0755) {
    $this->Folder = new Folder(dirname($path), $create, $mode);
    if (!is_dir($path)) {
        $this->name = basename($path);
    }
    $this->pwd();
    $create && !$this->exists() && $this->safe($path) && $this->create();
}

で、$this->name = basename($path);

.txtになってました
ロケールの問題でした..

以前公開したこちらで解決です
phpのbasenameはロケール次第で日本語が扱えない

CakephpでDIRECTORY_SEPARATORはDSでいい

CakephpではDIRECTORY_SEPARATORはDSでいいです

$ define(‘DS’, DIRECTORY_SEPARATOR);

してあるだけなんですが

[code lang=php:php]
$filePath = $directory . DS . 'some.txt';
[/code]

みたいな使い方です

定数のおさらいをしておきました
知らない定数もありました
http://book.cakephp.org/2.0/ja/core-libraries/global-constants-and-functions.html