Hatena::Diary

タイトル募集中2.0

2009-12-17

Zend_Rest_Serverについて

ZendFrameworkについてがっつりいろいろやったんだけど,書くのが面倒で更新が滞ってましたが,落ち着いてきたので少し記事を書いていきたいと思います.

まずは,xmlを返すようなシステムを作るために使ったZend_Rest_Serverについて.Content-Typeとかも勝手にtext/xmlにしてくれるので便利なんですが,公式のドキュメント読んでも意味がわからなくてかなり悪戦苦闘しました.(公式:http://framework.zend.com/manual/ja/zend.rest.server.html

書いてる通りやってるのに動かない.どうなってんのって感じだった.だから一生懸命ググったんだけど,ググれどもググれども,いい資料が見つからない.最後は,海外のフォーラムをさまよって,やっとわかりやすいサンプルをみつけることができた.(http://blog.ekini.net/2009/04/17/zend-framework-a-simple-zend_rest_server-example/

以下,http://localhost/zend/123のような感じでアクセスを想定したプログラム.123はidとしてルーティングしてあります.

//indexAction

$params = $this->_getAllParams();
$request = 省略...;

$server = new Zend_Rest_Server();
$server->setClass('XmlServer');
$server->handle($request);

//XmlServer.php
class XmlServer
{
	private $xmlString = '<?xml version="1.0" encoding="UTF-8"?><response></response>';
	public function getById($id)
	{
		$xml = new SimpleXMLElement($this->xmlString);
		//ノード追加処理は省略
		return $xml;
	}
}

受け取ったパラーメタを上のサイトにあるように

Array ( [method] => getById [id] => 123 ) 

のような配列にして$requestを作成.この配列のmethodの部分がsetClassで指定したクラスでよばれることになるようです.さらに,残りのパラメータ(ここでは[id] => 123)の値がそのメソッドの引数として渡されます.受け取る側は,

getById($id)

のようにして受け取ることができます.また,$requestのパラメータが↓こんなかんじで複数あるときは,

Array ( [method] => getById [id] => 123 [name] => hogeo ) 
getById($id, $name)

のようにして受け取ることになります.パラメータの数に合わせて良しなにやってくれるので楽でいいです.存在しないメソッドを呼んだときのエラー処理とかもやってくれます.

2009-09-17

ルーティング

この二つ読んだら出来た.

<?php
//index.php
$front = Zend_Controller_Front::getInstance();
	$router=$front->getRouter();
	$router->addRoute(
		'test_router',
		new Zend_Controller_Router_Route(
			'test/:id', //ルートの定義
			array( //デフォルト値
				'controller' => 'test',
				'action' => 'index',
				'id' => '000'
				),
			array(id' => '\d+')
        ));
Zend_Controller_Front::run('./application/controllers');
?>
<?php
//TestController.phpのindexAction
public function indexAction()
{
	$this->view->assign('id', $this->_getParam('id'));
}
?>
<?php
//view:index.phtml
echo $this->escape($this->id);
?>

これで,「http://localhost/test/123」でアクセスすると123って表示される.

2009-08-03

さあやるぞと思ったら

データベースの設計とかの勉強してなかったから,詰まった.

http://gihyo.jp/dev/feature/01/database/0001

これ読んで基本的なこと見てからやる.

2009-07-10

ErrorController

とりあえずやり方はわかった.

でも,Viewについての理解が中途半端なのでうまく表示できない.

出来たらまとめる.

とりあえず

Zend_Controller_Plugin_ErrorHandlerの項を参考に,一番簡単な記述の↓を使います.

<?
//index.php
require_once 'Zend/Controller/Front.php';
require_once 'Zend/Controller/Plugin/ErrorHandler.php';

$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler());

Zend_Controller_Front::run('./application/controllers');
?>

MVC での例外にある,__call(マジックメソッド?)を使ってもいいだけど,まだ理解してないのでパス(また今度勉強します).

ErrorControllerはサンプルを参考に

<?
require_once 'Zend/Controller/Action.php';

class ErrorController extends Zend_Controller_Action
{        
    public function indexAction() {
        
    }
    
    public function errorAction()
    {
        $this->_helper->viewRenderer->setNoRender();
        $errors = $this->_getParam('error_handler');
        
        switch ($errors->type) {
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
                // 404 エラー -- コントローラあるいはアクションが見つかりません
                $this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found');
                
                $content = "not found.";
                break;
            default:
                // アプリケーションのエラー
                $content = "error.";
                break;
        }
        // 前回の内容を消去します
        $this->getResponse()->clearBody();
        $this->getResponse()->setBody($content);
    }
}
?>

こんな感じに.わざわざviewのファイル作るほど内容がないので(1行しかない),レスポンスオブジェクトを使って出力してやります.

自動レンダリングをONにしてるとindex.phtmlやerror.phtmlを表示してしまうので「$this->_helper->viewRenderer->setNoRender();」を追加して自動レンダリングをOFFにします(これでこのアクションでだけOFFになる).

とりあずこれで.詳しくは追々勉強しよう.

2009-07-08

存在しないページ or アクションを呼んだときの処理

ZendFrameworkで存在しないページのURLを開こうとしたときとか,存在しないアクションを呼んだときの対処法を明日調べる.

なんか今,エラーメッセージが丸見えの状態なだけだからなあ.

JW FLV Player

最新版(4.5)をダウンロードして使ってみたら,変なリンクとロゴが表示されてじゃまなので

http://code.jeroenwijering.com/trac/browser/tags?rev=210

ここから過去のバージョンをゲット.

JW FLV Playerの各バージョン間比較を参考に一番新しい中で邪魔な表示のでない4.3にした.

コピペ怖い

formのsubmitボタンを画像にしたんだけど,どうもget送信したときに変な値まで一緒に送信されてるっぽいのでなにかと思ったら,タグが

<input type="image" src="hoge.png" value="" id="search"/>

のようになっているのが原因だった.ググったらこうするという記述が多かったのでtypeをimageにしてたんだけど,だめっぽい.

ということでCSSで背景画像として指定する.

/*HTML*/
<input type="submit" id="search" value=""/>
/*CSS*/
#search	{
    border: 0;
    height: 18px;
    width: 18px;
    background: #fff url(hoge.png) no-repeat;
}

できた.