質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

1回答

492閲覧

cakephp2 のコンソールからフロント側で動いている処理をバックエンドで動かす方法について

K.T_build

総合スコア29

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2018/06/04 01:52

編集2018/06/04 01:54

いつもお世話になっております。
現在、稼働中のシステムでフロントエンド側で動いている処理をCronを用いてバックエンドで自動化できないかと考えています。
※フロントエンド側はそのまま残す

質問させていただきたいのが、
シェルから起動した際に処理を引き渡したコントローラー側でコンポーネントの読み込みやモデルの読み込み(ConnectionManager)の読み込みが出来ません。

  ※testShell -> hogeController -> convertComponent の順で処理を行いたいが、
hogeController では、convertComponentの読み込みができていない。
※hogeControllerはフロントエンド側からもアクセスされ、
マスタ更新処理を行っている。

コントローラ側でコンポーネントの読み込みを行うにはどうすればよいのでしょうか?

以上、よろしくお願い致します。

Console

1【シェルの起動】 2 3# php app/Console/cake.php testShell main 0 4 5Error: Call to a member function isBeforeFileCheck() on null 6#0 /var/www/html/wage_production/app/Console/Command/ConvertItemContractPriceShell.php(28): ConvertItemContractPriceCsvController->exec('0') 7#1 /var/www/html/wage_production/lib/Cake/Console/Shell.php(458): ConvertItemContractPriceShell->main() 8#2 /var/www/html/wage_production/lib/Cake/Console/ShellDispatcher.php(219): Shell->runCommand('main', Array) 9#3 /var/www/html/wage_production/lib/Cake/Console/ShellDispatcher.php(66): ShellDispatcher->dispatch() 10#4 /var/www/html/wage_production/app/Console/cake.php(47): ShellDispatcher::run(Array) 11#5 {main} 12

php

1【①testShell】 2App::uses('AppController', 'Controller'); 3App::uses('hogeController', 'Controller'); 4App::uses('AbcClass', 'Class'); 5 6//App::uses('ComponentCollection', 'Controller'); 7//App::uses('ConvertComponent', 'Controller/Component'); 8 9class ConvertItemContractPriceShell extends Shell { 10 11 function startup(){ 12 parent::startup(); 13 14 // コントローラー設定 15 $this->hoge = new hogeController(); 16 } 17 18 public function main(){ 19 if(isset($this->args[0]) && IS_NUMERIC($this->args[0])){ 20 $offset = $this->args[0]; 21 } 22 23 $this->hoge->exec($offset); 24 25 } 26} 27 28

php

1【②hogeController(コントローラー)】 2 3class hogeController extends AppController { 4 public $components = array('Convert'); 5 6 /* フロントエンド側から */ 7 public function main(){ 8 $this->autoLayout = false; 9 $this->autoRender = false; 10 11 $err_path = $this->exec(); 12 $this->redirect('menu/index'); 13 } 14 15 /* フロントエンド & バックエンドの共通処理*/ 16 public function exec($offset = false){ 17 ini_set('memory_limit', '512M'); 18 setlocale(LC_ALL, 'ja_JP.UTF-8'); 19 $err_path = array(); 20 21 try { 22 $class = new ItemContractPriceClass(); 23 24 if($offset !== false){ 25 $class->INSERT_LOOP_OFFSET = $offset; //offsetを上書き 26 } 27 28 if($this->Convert->isBeforeFileCheck($class) === false){ 29 $err_path[] = "特約単価マスタのCSVデータが存在しません。"; 30 return $err_path; 31 } 32 33 //特約単価マスタの上書き更新(初期化) 34 if($this->Convert->updateToClass($class, false) === false){ 35 $err_path[] = "特約単価マスタの更新処理に失敗しました。"; 36 return $err_path; 37 } 38 return $err_path; 39 40 } catch (PDOException $e) { 41 echo 'Connection failed: ' . $e->getMessage(); 42 return $err_path; 43 } 44 } 45} 46 47 48/** 49 * 特約単価マスタクラス 50 */ 51class ItemContractPriceClass{ 52 public $TABLE_NAME = "m_item_contract_prices"; 53 public $MODEL_NAME = "MItemContractPrice"; 54 55 /* 以下略 */ 56} 57

php

1【③convertConponent(共通化処理)】 2 3class ConvertComponent extends Component 4{ 5 public function initialize(Controller $controller) { 6 $this->Controller = $controller; 7 $this->data = $this->Controller->data; 8 } 9 10 /** 11 * 事前にファイルが存在するかをチェック 12 * 13 * @param unknown $class 14 * @return boolean 15 */ 16 public function isBeforeFileCheck($class){ 17 // ファイル取得 18 $filepath = WWW_ROOT.'csv'.DS.$class->FILE_PATH.DS.$class->FILE_NAME; 19 $bool = file_exists($filepath); 20 21 return $bool; 22 } 23 24 /** 25 *コネクションマネージャーへの接続 26 *@return PDO 27 */ 28 private function ConnectionPDO(){ 29 App::uses('ConnectionManager', 'Model'); 30 ConnectionManager::_init(); 31 32 $cdd = ConnectionManager::$config; 33 $this->log($cdd, 'convert'); 34 $host = $cdd->default['host']; 35 $dbname = $cdd->default['database']; 36 $charset = $cdd->default['encoding']; 37 $user = $cdd->default['login']; 38 $pass = $cdd->default['password']; 39 40 41 $pdo = new PDO( 42 "mysql:host=$host;dbname=$dbname;charset=$charset", 43 $user, 44 $pass, 45 array(PDO::ATTR_EMULATE_PREPARES => false) 46 ); 47 48 return $pdo; 49 } 50 51 /**------------------------- 52 * CSVデータを基に現データに登録 53 * 54 * @param unknown $class 更新対象のクラス 55 * @param unknown $init_flg 初期化フラグ ※falseなら差分登録 56 * @throws Exception 57 * @return boolean 58 *-------------------------*/ 59 public function updateToClass($class, $init_flg = false){ 60 61 //データを取得 62 $fp = $this->getDataFilePointa($class); 63 64 //コネクションマネージャーへの接続 65 $pdo = $this->ConnectionPDO(); 66 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 67 68 /* 以下略 */ 69 } 70}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

?Shellのファイルと中のクラス名が違うとダメでしょ。
?cakeから呼ぶ時TestShell.php → test ですよね~。
http://tk2-207-13211.vs.sakura.ne.jp/2016/03/793/

投稿2018/09/18 04:10

tonkun4os

総合スコア321

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問