ここでは、FTP転送とSMBファイル転送(通常のファイル転送)をデザインパターンの1つである Builder パターンで実装するサンプルスクリプトを掲載しています。
スポンサーリンク
Builder パターン
Builder パターンとは、オブジェクトの生成過程を抽象化することによって、動的なオブジェクトの生成を可能にします。
Builder パターンで重要な点は、オブジェクトの生成手順を把握しているオブジェクトが1つであるということです。つまり、個々のオブジェクトの生成手順は同一となります(同一となるように実装する)。
FTP転送とSMBファイル転送の実装サンプル
次は、FTPファイル転送とSMBファイル転送を Builder パターンで実装するサンプルスクリプトになります。同一の手順で呼び出し、個々のオブジェクトがそれぞれの処理を行っています。
ちょっとダラダラと長くなりました (;^_^A
// Builder によって生成される結果オブジェクト class result { private $_result; public function setResult($result) { $this->_result = $result; } public function getResult() { return $this->_result; } } // ファイル転送 Builder インターフェース interface fileSendBulderInterface { public function open(); public function send($filepath); public function close(); public function getResult(); } // FTP ファイル転送 Builder class ftpFileSendBuilder implements fileSendBulderInterface { private $_result = false; private $_conn; public function open() { $this->_conn = @ftp_connect('接続先'); if($this->_conn == false) { return; } $this->_result = @ftp_login($this->_conn, 'user', 'password'); } public function send($local_filepath) { if($this->_result == false) { return; } $remote_filename = basename($local_filepath); $ret = @ftp_put($this->_conn, $remote_filename, $local_filepath, FTP_ASCII); } public function close() { @ftp_close($this->_conn); } public function getResult() { $result = new result(); $result->setResult($this->_result); return $result; } } // SMB ファイル転送 Builder class smbFileSendBuilder implements fileSendBulderInterface { private $_result = false; const REMOTE_DIR_PATH = '/pth/to/remote/dir'; public function open() { // 転送先ディレクトリがあるか確認する $this->_result = is_dir(self::REMOTE_DIR_PATH); } public function send($local_filepath) { // open に失敗していたらリターン if($this->_result == false) { return; } $remote_filepath = self::REMOTE_DIR_PATH . '/' . basename($local_filepath); $this->_result = copy($local_filepath, $remote_filepath); } public function close() { // 何もしない } public function getResult() { $result = new result(); $result->setResult($this->_result); return $result; } } // オブジェクトの生成手順を把握するディレクタークラス class fileSendDirector { private $_builder; // fileSendBulderInterface public function __construct($builder) { $this->_builder = $builder; } // ファイル転送手順を実施し、結果オブジェクトをリターンする public function sendFile($filepath) { $this->_builder->open(); $this->_builder->send($filepath); $this->_builder->close(); return $this->_builder->getResult(); } }
上記の Builder パターンで実装された処理を次のように呼び出します。
// 送信ファイルパス $filepath = '/path/to/local/file'; // FTP でファイルを送信する場合(builder に ftpFileSendBuilder を設定) $director = new fileSendDirector(new ftpFileSendBuilder()); $result = $director->sendFile($filepath); // SMB でファイルを送信する場合(builder に smbFileSendBuilder を設定) $director = new fileSendDirector(new smbFileSendBuilder()); $result = $director->sendFile($filepath);