Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
ラベル PHP の投稿を表示しています。 すべての投稿を表示
ラベル PHP の投稿を表示しています。 すべての投稿を表示

2014年6月20日金曜日

【CakePHP、OpAuth】Opauth-completeController could not be found.

一昨日から3日間、計8時間ぐらい悩んでやっと解決できたのでメモ。

環境

Windows + XAMPP + ローカルのCakePHPを使ったサイト

http://localhost/unityroom2/
でアクセスできるサイトを構築中
※unityroom2はサイト名なので適当に読み替えてください。

ローカル的には
C:\xampp\htdocs\unityroom2\app
C:\xampp\htdocs\unityroom2\lib
C:\xampp\htdocs\unityroom2\...
とCakePHPのフォルダが並んでるイメージ

やりたいこと

Twitterを使ったユーザー認証をしたい!
ただそれだけ。

ソーシャル認証に特化したOpAuthというものがあったのでそれを使おうとしてました。
https://github.com/uzyn/cakephp-opauth

やったこと

CakePHPのインストール

http://cakephp.jp/
ここから安定版ダウンロードして
C:\xampp\htdocs\unityroom2\
以下に配置

その他もろもろ初期設定

saltの設定とか
データベースの設定とか
DebugKitの導入とか
細々したのを終わらせて下記画面がでるところまでやった

CakePHP-OpAuthの導入

OpAuth自体はCakePHPに限定されずいろんなフレームワークで使えるみたい。
それをCakePHPで使えるようにしてくれるプラグインをまずは入れる。

ここからダウンロード
https://github.com/uzyn/cakephp-opauth
解凍して出てきたものを
C:\xampp\htdocs\unityroom2\app\Plugin\Opauth
に突っ込む。(Opauthフォルダは作る)

OpAuthの導入

ここからダウンロード(Download->Opauth core only)
http://opauth.org/
解凍して出てきたものを
C:\xampp\htdocs\unityroom2\app\Plugin\Opauth\Vendor\Opauth
に突っ込む

TwitterStrategyの導入

ここからダウンロード
https://github.com/opauth/twitter
解凍して出てきたものを
C:\xampp\htdocs\unityroom2\app\Plugin\Opauth\Strategy\Twitter
に突っ込む(Twitterフォルダは作る)

CakePHP-OpAuthの設定

C:\xampp\htdocs\unityroom2\app\Config\bootstrap.php
に下記を追記
CakePlugin::load('Opauth', array('routes' => true, 'bootstrap' => true));

Configure::write('Opauth.Strategy.Twitter', array(
    'key' => '**********API key***********',
    'secret' => '**************API secret************'
));
KeyはTwitterDeveloperからこぴぺ。

認証後のデータを受け取るコントローラを作成

C:\xampp\htdocs\unityroom2\app\Controller
にUsersController.phpを作成
<?php

class UsersController extends AppController
{
    function complete()
    {
        pr($this->request->data);
        $this->autoRender = false;
    }
}

認証後に上記コントローラへ飛ぶように設定

C:\xampp\htdocs\unityroom2\app\Config\routes.php
に下記を追加
Router::connect(
   '/opauth-complete/*', 
   array('controller' => 'users', 'action' => 'complete')
);

ここまでで一度実行

http://localhost/unityroom2/auth/twitter
にアクセス

すると下記エラー。

これはググるといろんなところに書かれているが、
Cakeをルートじゃなく1階層下に入れているから。

C:\xampp\htdocs\unityroom2\app\Config\bootstrap.php
に下記行を追加するとこのエラーは消える
Configure::write('Opauth.path', '/unityroom2/auth/');


再度実行するとTwitterの認証画面が出る


認証&エラー


こいつ!こいつが消せなくてめっちゃ困ってた。

対応

エラーでぐぐるとこれが出てくる
https://github.com/uzyn/cakephp-opauth/issues/21

その中に
I found the issue: I was specifying the route after calling CakePlugin::routes(); in my routes.php file
なんて記述を見つけたので先ほど書いたRouter::connectを移動してみた。


もう一度下記にアクセス
http://localhost/unityroom2/auth/twitter

あれ。。。さっきはこれでも同じエラー出てたんだけど
今ブログ書くために最初からやり直してたらこれで直った・・・

さっきは
C:\xampp\htdocs\unityroom2\app\Plugin\Opauth\Controller\OpauthAppController.php
の114行目を下記のように書き換えて対応してました。
//      $CakeRequest = new CakeRequest('/opauth-complete');
        $CakeRequest = new CakeRequest('/users/complete');

動いた画面。

以下ずらずらとTwitterからの情報が並びます。
URLはhttp://localhost/unityroom2/auth/callbackだけど
動作的にはちゃんとUsersController呼ばれてるみたい。
よくわからんけど解決。

疑問

疑問1

Twitter Developersのアプリケーション設定
WebSiteやCallbackURLは何入れても何も変わらなかった。
URLっぽいのが入ってればなんでもいいのか?

2014年6月12日木曜日

【CakePHP】MVCの決まりとか書き方とか忘れそうなので自分用にメモ


うに部屋を改修するためにCakePHPを覚え始めました。

教材はこちら
PHPも使いこなせてない状態で無理に覚えようとしてるのでかなり必死です。
とりあえず覚えたことをすぐ読み返せるようにメモしていきます。


DB

テーブル関係

決まり

・テーブル名は複数形 例)posts
・小文字なのか?(未確認)

必ず作る列

・id int not null auto_increment primary key
・created datetime default null
・modified datetime default null
created,modifiedに関してはなくてもいいけど作っとくとCakeが勝手に書き込んでくれるらしい。すんごい。

SQLの例

create table posts (
    id int not null auto_increment primary key
    ,title varchar(50)
    ,body text
    ,created datetime default null
    ,modified datetime default null
)

Model

決まり

・ファイルは[/app/Model/]に配置する
・クラス名は単数形のCamel方式 例)Post
・ファイル名はクラス名.php
・AppModelを継承する
・中身は何も書かなくてもいい?(未確認) 書かなくても読み書きできてる。

ソース例

<?php

class Post extends AppModel
{

}



View

決まり

・Controllerのメソッド1つに対して1つ作る(たぶん)
・ファイルは[/app/View/[Controller]/[メソッド名].ctp
・中身は普通にHTMLとPHP混在でいいっぽい
・Controllerのメソッド内でsetされた変数を呼び出せる
・Controllerで宣言されたヘルパークラスも使えるっぽい

ソース例
Controller内で下記のようにsetされている場合、
$this->[Model]->id = $id;
$this->set('hoge', $this->[Model]->read());
以下の感じのViewを書いておくと表示できる
<h2><?php echo h($post['Post']['title']); ?></h2>
<p><?php echo h($post['Post']['body']); ?></p>
すんごい

Controller

決まり

・ファイルは[/app/Controller/]に配置する
・クラス名は複数形+ControllerのCamel方式 例)PostsController
・ファイル名はクラス名.php
・AppControllerを継承する
・頭のほうにヘルパーを宣言しておくと便利
・メソッドを定義するとURLからアクセス可能になる
・PostsControllerにindexメソッドを定義した場合、
 http://hostname/sitename/Posts/index
 ってURLでアクセス可能になる。
 要するに [Controller]/[Method] でアクセス可能になるってこと。

ヘルパー

クラスのメンバ変数として宣言しておくと便利らしい(まだよくわからん)

書き方

public $helpers = array('Html', 'Form');
こんな感じ

Html

まだ調べてない
たぶん h()とかが入ってる。

Form

まだ調べてない

メソッド内でよく使いそうなもの

set

$this->set('foo','bar');
こうするとfoo変数にbarをセットできる。
Viewでfooを使えるようになる。

find('all')

$this->set('foo', $this->[Model]->find('all'));
これだけでDBからデータを取得できる。

read()

$this->[Model]->id = $id;
$this->set('hoge', $this->[Model]->read());
こうするとIDを指定したselectみたいになる。
↓の引数を受け取る方法を組み合わせて使う。

引数を受け取る

メソッドに引数をつけることができる
public function view($id = null)
とか。
こうすると /[Controller]/view/[id] ってURLでアクセスされた際に受け取れる。

Related Posts Plugin for WordPress, Blogger...