Cakephpでtest.phpにアクセスすると Debug setting does not allow access to this URL.のエラー

Cakphpでphpunitをいれると、/test.phpのアドレスでテスト結果が見れますが

Debug setting does not allow access to this URL.
のエラーがでました

cakephp_test.php

ただ単にデバックレベルを2にしないとだめだっただけ..

$ vim Conifig/core.php

Configure::write('debug', 2);

これで直りました

CakephpでTwitter APIを使ってツイート情報をとってみた

CakephpでTwitter APIを使ってツイートをとってみました
ローカル環境で行い、アクセストークンを手抜して取得したバージョンです

cakephpはインストール済み
参考)
ComposerでCakephpを入れてみた | bgbgbg
cakephp cookbook のチュートリアルをcomposerを使ってやってみた | bgbgbg

TwitterOAuth PHP Library for the Twitter REST APIを使いました
まずはTwitterOAuthのインストール

composerを使うのでCakephpのアプリケーションディレクトリで

$ composer require abraham/twitteroauth

これで、Vendor/abraham/twitteroauth
にインストールされます

ControllerとViewを用意

$ vim Controller/TwittersController.php

App::import('Vendor','abraham/twitteroauth/autoload');
use Abraham\TwitterOAuth\TwitterOAuth;

をclassの上に追記しておくと

$connection = new TwitterOAuth($consumer_key, $consumer_secret, $access_token, $access_token_secret);

とTwitterOAuthが呼び出せるようになります

Twitter APIをたたくには4つの情報が必要になります

  • consumer_key
  • consumer_secret

これが呼び出すアプリのIDとパスワードに当たります
これから作るCakephpのサービスをTwitterが区別できるようにします
Twitter Application Management
にアクセスしてアプリを作ります

Create New App で

twitterapi

Name
Description
Website

を入力
Websiteはローカル環境なので http://127.0.0.1/ にしておきました
登録したら

Keys and Access Tokensタブをクリック

  • Consumer Key (API Key)
  • Consumer Secret (API Secret)

が手に入りました

あと2つ、Access Tokenが必要になります
これはユーザーの情報をプログラムが取得する際のIDとパスワードに当たります

ユーザーのTwitter情報を取得する際に、ユーザーID・パスワードをプログラムでもらうのでなく
Access Tokenをもらって認証しにいきます
アプリごとに発行されるIDとパスワードなので、少しは安全になります

Access Tokenは同じ画面下でGenerateで生成できます

twitterapi3

※画像は一度生成したあとだったのでRegenerateになっています

そしたら

  • Access Token
  • Access Token Secret

が手に入ります
そしたらプログラムに戻って、Twitter情報をとってみます

<?php
App::uses('AppController', 'Controller');
App::import('Vendor','abraham/twitteroauth/autoload');
use Abraham\TwitterOAuth\TwitterOAuth;

class TwittersController extends AppController {

    public function index() {

        $consumer_key = 'xxxxxx';
        $consumer_secret = 'xxxxxx';
        $access_token = 'xxxxxx-xxxxxx';
        $access_token_secret = 'xxxxxx';

        $connection = new TwitterOAuth($consumer_key, $consumer_secret, $access_token, $access_token_secret);

        $params = ['q' => '#cakephp' ,'count' => '10', 'lang'=>'ja'];
        $data = $connection->get('search/tweets', $params)->statuses;
        $this->set(compact('data'));
    }
}

これで、#cakephpのハッシュタグがついた情報が取れるので
Viewで表示させる処理をかけば情報が表示できます

実際に使うにはAccess TokenをTwitter認証させて取る必要があります

CakephpでPaginator->numbersのリンク先を変える

cakephp 2.6でPaginator->numbersのリンク先を変えるのに調べてみました

参考) Paginator — CakePHP Cookbook 2.x ドキュメント

Config\routes.php
でurlをセットした時に調べました

routes.phpを

    $defaults = array('controller' => 'sample');
    Router::connect('/sample', $defaults);
    Router::connect('/sample/:type/:mode', $defaults);

なんてしたときに

Viewでpaginator->numbersを表示させると

    <?php echo $this->Paginator->numbers(); ?>

sample/type/mode にアクセスした時
ページャーのリンク先が sample?page=2 とかになってほんとは sample/type/mode?page=2
にしたいってときは

    <?php echo $this->Paginator->numbers(array('type'=>$type, 'mode'=>$mode)); ?>

sample/type/mode?param=100 にアクセスした時
ページャーのリンク先が sample/type/mode?page=2 になるので
クエリパラメータ残して sample/type/mode?param=100&page=2 にしたいときは

    <?php echo $this->Paginator->numbers(
            array(
                'type'=>$type, 'mode'=>$mode,
                array('?'=>array('param'=>'100'))
            )
    ); ?>

と ? の配列を追加してやるとできました

コアのソースコードを読んでみつけました

CakephpのModelのorderをbeforeFindでセット

CakephpのModelのorderをいちいちセットするのが面倒だったので、beforeFindでセットしてみました

Sampleモデルのnameフィールドでorderをかけてみます

class Sample extends AppModel {
    public function beforeFind($queryData) {
        $queryData['order'][] = 'name';
        return $queryData;
    }
}

こんな感じで、findするときは勝手にorderがセットされます