zend framework のライブラリを使ってみる

107 views
Skip to first unread message

custar

unread,
Aug 1, 2009, 4:21:59 AM8/1/09
to CakePHP-ja
cake 導入検討時から考えてたけど、不要だったので使わなかった zf のライブ
ラリをやっと使ってみようと動き出しました。


cake 1.2.3.8166
zend framework 1.9
php 5.2.8


試しに json を使ってみましょう。


(1) まずは book を確認してみる。

- 4.4.4.5 Loading Vendor Files
http://book.cakephp.org/view/538/Loading-Vendor-Files

???

App::import() を何処に書けと?
ライブラリなんだから、使いたい処で呼び出して生成せよ、と解釈。




(2) zf をダウンロード。

- Zend Framework 1.9.0 Minimal
http://framework.zend.com/download/current/




(3) vendors に展開。

$ pwd
/home/custar/htdocs/sandbox/zend_framework/vendors

$ tar xfz ZendFramework-1.9.0-minimal.tar.gz

$ ls -lF
drwxr-xr-x+ ZendFramework-1.9.0-minimal/
drwxr-xr-x+ shells/

人によっては ZendFramework-1.9.0-minimal/library/Zend/ の Zend 部分だけ
や、必要なクラスファイルのみを抜き出すかもしれないけど、今は練習なので、
このままに。




(4) users_controller.php で呼び出す。

// controllers/users_controller.php
<?php
App::import('Vendor', 'Zend_Json', false, array(),
'Zend'.DS.'Json.php', false);

class UsersController extends AppController
{
public $name = 'Users';
public $scaffold;

public function hello()
{
$attributes = array(
'language' => 'php',
'framework' => 'cakephp'
);

$json = Zend_Json::encode($attributes);
$this->set(compact('json'));
}
}
?>

// views/users/hello.ctp
<?php echo $json; ?>


この状態で /users/hello にアクセスすると、

| Warning (2):
| require_once(Zend/Json/Expr.php)
| [
| function.require-once]:
| failed to open stream:
| No such file or directory [APP\vendors\Zend\Json.php,
| line 27
| ]
|
| Fatal error:
| require_once() [function.require]:
| Failed opening required 'Zend/Json/Expr.php'
| (include_path='C:\xampp\htdocs\sandbox\zend_framework\;.;C:\xampp\php
\pear\')
| in C:\xampp\htdocs\sandbox\zend_framework\vendors\Zend\Json.php
| on line 27

当然エラーが発生する。

- Zend Framework Quick Start
http://framework.zend.com/docs/quickstart/create-your-project

によると、

| Optionally,
| you can add the path to the library/ subdirectory of the archive
| to your php.ini's include_path setting.

だそうで、それをやってくれるのが、"zf Command Line Tool" だと。

その実処理は bin/zf.php の zf_setup_tool_runtime() がやっている。
他の人が書いているように、

ini_set('include_path', ...)

と同じことを zf_setup_tool_runtime() でやっている。
人と同じことをやるのは面白くないので、今回は、このままやり通す。




(5) zf_setup_tool_runtime() を実行。

// config/bootstrap.php
require_once('../vendors/ZendFramework-1.9.0-minimal/bin/zf.php');
zf_setup_tool_runtime();


zf.php 内部では強制的に zf_main() が実行されるので、それをコメントアウト。

// vendors/ZendFramework-1.9.0-minimal/bin/zf.php
//zf_main();




(6) /users/hello にアクセス

{"language":"php","framework":"cakephp"}

と表示された。




以上

custar

unread,
Aug 1, 2009, 4:30:36 AM8/1/09
to CakePHP-ja
zf library をごっそり置くのは宜しくない。
App::import() の内部で、凄い数のファイル検索が行われてしまうから。

必要なものだけを vendors に置くべきかな。
但し、今回は "試し"。


それに、zf_setup_tool_runtime() を実行するよりも、
ずばり ini_set('include_path', ...) をやった方がすっきりする。

custar

unread,
Aug 1, 2009, 4:40:36 AM8/1/09
to CakePHP-ja
- Zend Framework Loader Component
http://bakery.cakephp.org/articles/view/zend-framework-loader-component

App::import() を使うより、このコンポーネントの方がいいかもしれない。
zf 自体の Loader を使ってるから。
実装を読まないと分からないが。

もしかしたら、zf library を全部置いてても全検索されることがないかもしれない。

custar

unread,
Aug 1, 2009, 11:37:16 AM8/1/09
to CakePHP-ja
このコンポーネントの方が楽。

<?php
class UsersController extends AppController
{
public $name = 'Users';
public $components = array('Zend');
public $scaffold;

public function imap()
{
$this->Zend->loadClass('Zend_Mail_Storage_Imap');

$gmail = array(
'host' => 'imap.gmail.com',
'user' => '...',
'password' => '...',
'ssl' => 'SSL',
'port' => 993
);

try
{
$mail = new Zend_Mail_Storage_Imap($gmail);
}
catch (Exception $ex)
{
$this->Session->setFlash($ex->getMessage());
}
}
}
?>
Reply all
Reply to author
Forward
0 new messages