少し前にRaspberry piの記事が、当ブログの上位アクセスに食い込んだという話に
気を良くして、今回も懲りずに技術ネタをお送りします。
現在Zend Framework 2(以後ZF2)というフレームワークを使って、仕事をしているのですが
日本語のヘルプサイトやQAが少ないので、調査等に少しばかり難儀しております。
※StackOverflow等にはいろいろとQAが載っていますので、英語が得意な方は問題無いかと思います
その中でも、私が調べた事の中で、ZF2を使って開発をするに当たり「これって他の人も調べるのでは?」というTIPSを少しだけ紹介します。
各viewファイルで使える変数をcontrollerの基底クラスから設定したい
親クラスのonDispatchメソッドに下記の様に記載します。
- use Zend\Mvc\Controller\AbstractActionController;
- class BaseController extends AbstractActionController {
- public function onDispatch(\Zend\Mvc\MvcEvent $e) {
- $e->getViewModel()->setValuables(
- array(
- "application_name" => "hoge application"
- )
- );
- return parent::onDispatch($e);
- }
- }
レイアウトファイルでは下記の様に
- <?php echo $this->application_name; ?>
各テンプレートでは下記の様に参照する事が可能です。
- <?php echo $this->layout()->application_name; ?>
onDispatchメソッドは各Actionが実行される前に実行されるので、前処理や共通処理を書くのに適していますね。
※戻り値は必ず親のonDispatchの結果を返しましょう。
ページで実行されたSQLを確認したい
ZendDevelopper ToolsとBjyProfilerというプラグインを使います。
SQLの実行結果・速度の他、ページ容量やレスポンスタイムまでが画面に表示されます。非常に便利です。
上記のgithubのリンクからzipファイルをDLの上、vendorフォルダに解凍しておきます
Shell(gitコマンド)が使える環境の場合はvendorフォルダ内で下記コマンドを実行します
- cd /project/root/path/vendor
- git clone git://github.com/zendframework/ZendDeveloperTools.git
- git clone git://github.com/bjyoungblood/BjyProfiler.git
その後下記のファイルを
vendor/ZendDeveloperTools/config/zenddevelopertools.local.php.dist
下記のフォルダにコピー
/project/root/path/config/autoload/zenddevelopertools.local.php
application.config.phpの修正(プラグイン有効化)
- <?php
- /**
- * Configuration file generated by ZFTool
- * The previous configuration file is stored in application.config.old
- *
- * @see https://github.com/zendframework/ZFTool
- */
- return array(
- ‘modules’ => array(
- ‘Application’,
- // 下記2行を追加
- ‘ZendDeveloperTools’,
- ‘BjyProfiler’,
- ),
- ‘module_listener_options’ => array(
- ‘module_paths’ => array(
- ‘./module’,
- ‘./vendor’
- ),
- ‘config_glob_paths’ => array(‘config/autoload/{,*.}{global,local}.php’)
- )
- );
環境にあったデータベース設定ファイルの修正(global.php local.php等)
- <?php
- /**
- * Global Configuration Override
- *
- * You can use this file for overriding configuration values from modules, etc.
- * You would place values in here that are agnostic to the environment and not
- * sensitive to security.
- *
- * @NOTE: In practice, this file will typically be INCLUDED in your source
- * control, so do not include passwords or other sensitive information in this
- * file.
- */
- return array(
- ‘phpSettings’ => array(
- ‘display_startup_errors’ => false,
- ‘display_errors’ => false,
- ‘max_execution_time’ => 1800,
- ‘date.timezone’ => ‘Asia/Tokyo’,
- ‘mbstring.internal_encoding’ => ‘UTF-8’,
- ),
- ‘db’ => array(
- ‘driver’ => ‘Pdo’,
- ‘dsn’ => ‘pgsql:host=****;port=****;dbname=****’,
- ‘database’ => ‘****’,
- ‘username’ => ‘*****’,
- ‘password’ => ‘****’,
- ),
- ‘service_manager’ => array(
- ‘factories’ => array(
- ‘Zend\Db\Adapter\Adapter’ => function ($sm) {
- $adapter = new BjyProfiler\Db\Adapter\ProfilingAdapter(array(
- ‘driver’ => ‘pdo’,
- ‘dsn’ => ‘pgsql:host=****;port=****;dbname=****’,
- ‘database’ => ‘****’,
- ‘username’ => ‘****’,
- ‘password’ => ‘****’
- ));
- $adapter->setProfiler(new BjyProfiler\Db\Profiler\Profiler);
- $adapter->injectProfilingStatementPrototype();
-  
; return $adapter;- },
- ),
- ),
- );
これで設定は完了です。
アクセスすると画面下部に冒頭のような黒帯が出現します。(各項目をマウスオーバーする事で詳細が確認出来ます)
※ただし、解析の為内部的にSQLを重複して投げているようなので、当然レスポンスは落ちます。
レスポンスをHTMLでは無く、JSONやプレーンテキストでクライアントに返したい
- class SampleController extends BaseController
- public function sampleAction() {
- $viewModel = new ViewModel();
- $viewModel->setTerminal(true); // この一文を加える事でlayoutファイルの出力が抑制されます
- $viewModel->setTemplate("sample/sample.txt");
- return $viewModel;
- }
- }
レスポンスヘッダーは特に変更されないので、適切なContent-Typeを指定してください。
サーバー側の設定値をクライアントでも使いたい
参照したい時があるかと思います。
この場合
・サーバー側と同じ設定値を記載するJSファイルを配置→2重メンテナンスになるので無し
・Ajaxで都度取ってくる→JS書くの面倒。と言うか都度通信走るの非効率じゃない?
上記のような案が出てくるのですが、どれもいまいち
という事で、設定値をクラス内定数で記載している場合のみしか使えませんが
下記の方法を考えてみました。
・ZF2のactionを参照するscriptタグをlayoutファイルに記述
・リクエストを受け取ったactionは設定値クラスをJSで読める様に記載(JSON)
まずは下記のような設定クラスがあったとします。
- class Constants {
- const APPLICATION_NAME = "ぼくのかんがえたさいきょうのかーぷだせん";
- const BATTER_1 = "おがた";
- const BATTER_2 = "きくち";
- const BATTER_3 = "まえだ";
- const BATTER_4 = "やまもと";
- const BATTER_5 = "きぬがさ";
- const BATTER_6 = "えとう";
- const BATTER_7 = "のむら";
- const BATTER_8 = "たつかわ";
- const BATTER_9 = "まえだけん";
- }
Controllerを追加し、下記Actionを記載します
- class ConstantsScriptController extends AbstractSalesController {
- public function onDispatch(\Zend\Mvc\MvcEvent $e) {
- $this->getResponse()->getHeaders()->addHeaderLine("Content-Type", "text/javascript");
- return parent::onDispatch($e);
- }
- public function constAction() {
- // ReflectionClassを利用してハッシュ形式で設定を得ます
- $constantsClass= new \ReflectionClass("\Constants");
- $constantsArray = $constantsClass->getConstants();
- $viewModel = new ViewModel(array("consts" => $constantsArray));
- $viewModel->setTerminal(true);
- return $viewModel;
- }
- }
このActionに対するviewはこれだけです。
- var Constants = Constants || {};
- Constants = <?php echo json_encode($consts)?>;
layoutファイルに上記Actionを読み込むscriptタグを追加します。
- <?php echo $this->headScript()->prependFile($this->basePath() . ‘/ConstantsScript/const’); ?>
これでグローバル領域にConstsという変数が出来、その中に設定クラスの内容が反映されるようになりました。
ただし、出力がJSファイルになるため、簡単にコードを読むことが可能にです。
この方法で共有する場合は、設定値にパスワードや認証情報等を含め無いようにします。
バッチファイルを書きたい
- use Zend\Mvc\Controller\AbstractActionController,
- Zend\Console\Request as ConsoleRequest;
- class BatchController extends AbstractActionController {
- public function doneAction() {
- // —–ここから
- set_time_limit(0);
- $request = $this->getRequest();
- if (!$request instanceof ConsoleRequest) {
- throw new \RuntimeException("コンソールからのみ起動できます");
- }
- // —–ここまでは基底クラスを作ってonDispatchにて処理を行うと楽です
- // 処理を書く
- // ……
- // 終了
- exit(0);
- }
- }
ルーティングの設定
Application/config/module.config.php
- <?php
- return array(
- ‘controllers’ => array(
- ‘invokables’ => array(
- // 追加
- ‘Hoge\Controller\Batch’ => ‘Hoge\Controller\BatchController’
- )
- ),
- // ….中略
- // コンソールアプリ設定
- // 書式はWebアプリ設定のrouterと同様
- // Placeholder for console routes
- ‘console’ => array(
- ‘router’ => array(
- ‘routes’ => array(
- ‘batch’ => array(
- ‘options’ => array(
- ‘route’ => ‘batch’,
- ‘defaults’ => array(
- ‘__NAMESPACE__’ => ‘Hoge\Controller’,
- ‘controller’ => ‘Batch’,
- ‘action’ => ‘done’
- )
- )
- )
- ),
- ),
- ),
- );
実行コマンド
- cd /path/to/project/public
- php index.php batch > /path/to/stdout.log 2>&1 &
Webアプリ側で製造したService等を再利用出来るので、開発工数を減らすことができます。