@blog.justoneplanet.info

日々勉強

Zend_Controller_Router_Route_Regexで正規表現によるルーティング設定を行う

以下のように、Zend_Controller_Router_Route_Regexを使用する。

$front->getRouter()->addRoute(
	'page',
	new Zend_Controller_Router_Route_Regex(
		'page_(\d+)\.html',
		array(
			'controller' => 'Index',
			'action'     => 'page'
		),
		array(
			1 => 'pageid'
		)
	)
);

Actionからは以下のコードでマッチした部分を参照できる。

$this->_getParam('pageid');

但し、URLヘルパーやこのクラスのメソッドを使用する場合は第4引数が必要となる。

$front->getRouter()->addRoute(
	'page',
	new Zend_Controller_Router_Route_Regex(
		'page_(\d+)\.html',
		array(
			'controller' => 'Index',
			'action'     => 'page'
		),
		array(
			1 => 'pageid'
		),
		'page_%d.html'
	)
);

参考

  • http://framework.zend.com/manual/ja/zend.controller.router.html
  • http://codezine.jp/article/detail/2226?p=2

PHPからドメインを取得する

var_dump($_SERVER['SERVER_NAME']);
//string(16) "sample.org" 

マルチドメイン、シングルホスティングの時には使いそうだ。

特定のユーザにmysqlリモート接続を許可する

その前にポート3306は初期状態では閉じられているので開ける。

iptables -I INPUT -j ACCEPT -p tcp -s x.x.x.x --dport 3306

IPはクライアント側のIP。このIPからだけ接続できる。192.168.1.%のようにワイルドカードも使える。

GRANT ALL PRIVILEGES ON *.* to user@'192.168.1.1' IDENTIFIED BY 'password';

FTP用ユーザのディレクトリを制限する

■vsftpの場合

vi /etc/vsftpd/vsftpd.conf

chroot_list_enableとchroot_list_fileの記述を以下のように修正する。

chroot_list_enable=YES
chroot_list_file=/etc/vsftpdd.chroot_list
vi /etc/vsftpd/vsftpd.conf

ファイルに制限したいユーザ名を書く。

ftp_user

再起動を忘れずに。

/etc/init.d/vsftpd restart

ftp_userがホームディレクトリより上にいけなくなる。

ZendFrameworkでコマンドラインからアクションを実行する

コマンドラインにおけるオプションの設定・取得。|の後がエイリアス名、=の後の文字列で型を指定できる。

try {
    $options = new Zend_Console_Getopt(
        array(
            'help|h'        => 'help.',
            'zfm|m=s'       => 'module',
            'zfc|c=s'       => 'controller',
            'zfa|a=s'       => 'action'
        )
    );
    $options->parse();
}
catch(Zend_Console_Getopt_Exception $e){
    die($e->getMessage() . ' : ' . $e->getUsageMessage());
}

Zend_Controller_Request_Simpleがポイント。アクション、コントローラ、モジュールを引数に指定してリクエストオブジェクトを取得する。

if(isset($options->zfa) && isset($options->zfc) && isset($options->zfm)){
    $request = new Zend_Controller_Request_Simple(
        $options->zfa,
        $options->zfc,
        $options->zfm
    );
    $front = Zend_Controller_Front::getInstance();
    $front->setRequest($request);
    $front->setRouter(new Custom_Controller_Router_Cli());
    $front->setResponse(new Zend_Controller_Response_Cli());
    $front->throwExceptions(true);
    $front->addModuleDirectory(dirname(__FILE__) . '/application/modules');
    $front->dispatch();
}

Custom_Controller_Router_Cliはこんな感じ。

<?php
require_once 'Zend/Controller/Router/Interface.php';
require_once 'Zend/Controller/Router/Abstract.php';

class Custom_Controller_Router_Cli extends Zend_Controller_Router_Abstract implements Zend_Controller_Router_Interface
{
    public function assemble($userParams, $name = null, $reset = false, $encode = true) {}
    public function route(Zend_Controller_Request_Abstract $dispatcher) {}
}

基本的には以上で実行できるが

■アクセスコントロールの設定

アクセスコントロールを行っている場合は上述のコードよりも先にアクセスできるようにしなければならない。以下は一例。

$sesion = new Zend_Session_Namespace('global');
$sesion->userLevel = 'admin';
$acl = new Zend_Acl();
$acl->addRole(new Zend_Acl_Role('guest'));
$acl->addRole(new Zend_Acl_Role('admin'), 'guest');
$acl->add(new Zend_Acl_Resource('guestPage'));
$acl->add(new Zend_Acl_Resource('adminPage'));
$acl->allow('guest');
$acl->allow('admin');
$acl->deny('guest', 'adminPage');
$acl->allow('admin', 'adminPage');
Zend_Registry::set('acl', $acl);

基本的には一般ユーザが閲覧(実行)できる場所に、このファイルを配置するのは良くない。

PHPの定数とOS

■OS

OS名

echo PHP_OS;

■path

パスを区切る文字

echo PATH_SEPARATOR;// linux => ';', win => ':'

■directory

ディレクトリを区切る文字

echo DIRECTORY_SEPARATOR;// linux => '/', win => '\'