Home > Archives > 初めてのPHP プログラミング

初めてのPHP プログラミング

Publish:

ZendFrameworkを基づき、PHP開発環境の構成を行う

開発環境構築


必須ツールとパッケージとのダウンロード・インストール

ZendFramework-1.11.11 ダウンロード
xamppV3.2.2

「mysql」、「tomcat」、「phpmyadmin」を含めて、すべてのインストールコンポーネントをインストールしておく。 [techacademyさんのxamppをインストールする]

ポート衝突に対する対策。

1)Skype

>> Skypeのメニュー「ツール」☞「設定」をクリックし、設定画面が表示される。その設定画面には「接続」をクリックし、「上記のポートに代わりに、ポート80と443を使用」とのチェックボックスを外して「保存」ボタンを押下する

2)VMware Tray Process

>> タスクマネージャーに該当するプロセスを止めておく

PHP5.63

(xamppwoがインストールされたら、xamppのインストールフォルダの直下にPHP関連フォルダが見当たるはずだ.)

zendframeworkを利用するために、Zend Frameworkのライブラリ(Coreが含まれるディレクトリ)をPHPのinclude_pathに含める。実現方法が三つである

1)php.iniのinclude_pathディレクティブにZend Frameworkのlibraryディレクトリへのパスを追加する

include_path = ".;C:/Development/application/library"710行目

2)PHPファイルの先頭に、set_include_pathメソッドを呼び出す

3)Zend Frameworkのライブラリ(Zend/*)をAPPのlibraryディレクトリにコープする

※今回のサンプルには方法3)を使っている

PHP PATH(環境変数)の設定

PATH=C:\xampp\php
apache (xamppwoがインストールされたら、xamppのインストールフォルダの直下にapache関連フォルダが見当たるはずだ)

1)httpd.confの設定

Zend FrameworkのMVCモデルを使用するには、まずApache HTTP Serverのmod_rewriteを有効にする必要がある。 httpd.conf内でrewrite_moduleがロードされていることを確認し、ルートディレクトリのAllowOverrideディレクティブの設定を変更する。 そうしないと、403エラー(Access forbidden!)とのエラーが発生する。
   <Directory C:\xampp\htdocs\PhpDemo\public>
        DirectoryIndex index.php
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
  

2)httpd-vhosts.confの設定

もしVirtualHostを使う要望が出てきたら、「1)httpd.confの設定」を廃棄し、%apache_home%/conf/extra/httpd-vhosts.confに以下の設定を行う
     <VirtualHost *:80>
    ServerName PhpDemo.local
    DocumentRoot C:\xampp\htdocs\PhpDemo\public
 
    SetEnv APPLICATION_ENV "development"
 
    <Directory C:\xampp\htdocs\PhpDemo\public>
        DirectoryIndex index.php
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
     
mysql (xamppwoがインストールされたら、xamppのインストールフォルダの直下にmysql関連フォルダが見当たるはずだ)

1)DBユーザのパスワードの初期化

xamppwoをインストールする間にMysqlのSIDとPWDなど情報入力の画面が表示されないため、DBのSIDとPWDがデフォルト値に設定されるはずだと見込んでいる。 ( http://localhost/phpmyamdinをアクセスして、「mysql」DBを選択し、「user」テーブルには「password」列に空である二件レコードしかないんだ。)

なので、以下の設定を行っとく

NetBeans 8.1

NetBeansのメニュー「ツール」☞「オプション」をクリックし、「オプション」画面が表示される。その画面に、「PHP」タブ☞「フレームワーク及びツール」タブをクリックし、 NetBeansに提供されるフレームワーク及びツール一覧が見える。

1)zendのスクリプトを設定

E:\99.Workspace\phpspace\ZendFramework-1.11.11\bin\zf.bat

ZendFrameworkの使い方


プロジェクトに右クリックし、「Zend」☞「コマンド実行」をクリックしたら、「Zendコマンドの実行」子画面がポップアップされてくる

% zf enable layoutを実行したら、

application/configs/application.iniのproductセクションに以下内容が追加される

resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"

且つ、application/layouts/scripts/layout.phtmlが作られる。

そして、application/configs/application.iniのproductセクションに手動的に以下の内容を追加する

resources.view[] =
データベースを作成
production DB:phpdb
test DB:phpdb
development DB:phpdb
user/pwd:phpdbuser/phpdbuser
db-adapterを設定 Zendコマンド実行画面で下記コマンドを実行する
$ zf configure db-adapter "adapter=PDO_MYSQL&dbname=phpdb&host=localhost
&username=phpdbuser&password=phpdbuser" production
$ zf configure db-adapter "dbname=phpdbtest&host=localhost
&username=phpdbuser&password=phpdbuser" testing
$ zf configure db-adapter "dbname=phpdbdev&host=localhost
&username=phpdbuser&password=phpdbuser" development
DB初期化 /script/data.mysql.sql
INSERT INTO guestbook (email, comment, created) VALUES
('ralph.schindler@zend.com', 'Hello! Enjoy this sample zf application!', '2012-01-01 00:00:00'),
('foo@bar.com', 'Baz baz baz, baz baz Baz baz baz - baz baz baz.', '2012-01-01 00:00:00');
/script/schema.mysql.sql
DROP TABLE IF EXISTS guestbook;

CREATE TABLE guestbook (
    id int NOT NULL AUTO_INCREMENT,
    email varchar(32) NOT NULL DEFAULT 'noemail@example.com',
    comment TEXT NULL,
    created DATETIME NOT NULL,
    PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
CREATE INDEX id ON guestbook(id);
/script/load.mysql.php(略) ※Utilみたい

DOS のコマンドラインから以下を実行することで、DB初期を終わらせる

% php scripts/load.mysql.php --withdata
「-e」オプションを使うとAPPLICATION_ENV定数に使用する値を指定できます。
db-tableを作成 % zf create db-table Guestbook guestbook
class Application_Model_DbTable_Guestbook extends Zend_Db_Table_Abstract
{
    /** Table name */
    protected $_name    = 'guestbook';
}
modelを作成 % zf create model GuestbookMapper
class Application_Model_GuestbookMapper
{
    protected $_dbTable; 
    public function setDbTable($dbTable)
    {
        if (is_string($dbTable)) {
            $dbTable = new $dbTable();
        }
        if (!$dbTable instanceof Zend_Db_Table_Abstract) {
            throw new Exception('Invalid table data gateway provided');
        }
        $this->_dbTable = $dbTable;
        return $this;
    } 
    public function getDbTable()
    {
        if (null === $this->_dbTable) {
            $this->setDbTable('Application_Model_DbTable_Guestbook');
        }
        return $this->_dbTable;
    }    
    public function save($model){
    ......
    }
    public function find($id, $model){
    ......
    }
    public function fetchAll(){
    ......    
    }
}
% zf create model Guestbook
class Application_Model_Guestbook
{
    protected $_comment;
    protected $_created;
    protected $_email;
    protected $_id;
    
     public function __construct(array $options = null)
    {
        if (is_array($options)) {
            $this->setOptions($options);
        }
    }
 
    public function __set($name, $value)
    {
        $method = 'set' . $name;
        if (('mapper' == $name) || !method_exists($this, $method)) {
            throw new Exception('Invalid guestbook property');
        }
        $this->$method($value);
    }
 
    public function __get($name)
    {
        $method = 'get' . $name;
        if (('mapper' == $name) || !method_exists($this, $method)) {
            throw new Exception('Invalid guestbook property');
        }
        return $this->$method();
    }
 
    public function setOptions(array $options)
    {
        $methods = get_class_methods($this);
        foreach ($options as $key => $value) {
            $method = 'set' . ucfirst($key);
            if (in_array($method, $methods)) {
                $this->$method($value);
            }
        }
        return $this;
    }
    public function setId($id)
    {
        $this->_id = (int) $id;
        return $this;
    }
 
    public function getId()
    {
        return $this->_id;
    }
    //以下省略
}
controllerを作成 % zf create controller Guestbook
class GuestbookController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $guestbook = new Application_Model_GuestbookMapper();
        $this->view->entries = $guestbook->fetchAll();
    }
}

コントローラにメソッドを使おうとしたら、XXXActionの命名規約を守ること。 そしてapplication/views/scripts/モジュール名/メソッド名.phtmlを追加しないとならない。ただメソッドにforwordまたはredirectをするのなら、追加必要がない

$this->_redirect('/guestbook/index?msg=' . $result);//追加必要がない
$this->view->entries = $guestbook->fetchAll();//追加するべきだ。$this->viewはメソッド名.htmlと紐づけているデフォルト仕組みがあるのかもしれない。

Zend Frameworkで推奨されている.htaccessファイルの設定は拡張子がjs、ico、gif、jpg、png、css以外のファイルに対するアクセスをindex.phpへのアクセスへrewriteする設定になる。 これをZend Frameworkを使用するアプリケーションのルートディレクトリに配置して、PHPスクリプトへのアクセスをindex.phpで一括制御します。

RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

デフォルト設定は以下となり、js、ico、gif、jpg、png、cssなどファイルをpublicフォルダにおかないと、index.phpに制御されため、アクセスすることができない

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

Learning Zend Framework
jesさんのZEND FRAMEWORK QUICKSTART WITH MYSQL

Disclaimer: This article is based on BY-NC-SA license. Reproduced please specify switched from: whisper