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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

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

Q&A

解決済

1回答

8700閲覧

cakephp3のshellでデータベースへの接続について

WADA1234

総合スコア25

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

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

0グッド

0クリップ

投稿2016/10/04 20:39

こんにちは。

cakephp3でshellの実行をしたいと考えております。

ProcsShellを作り、モデルのUsersを呼び出そうとしております。
プログラムは下記のとおりです。

src/shell/ProcShell.php

cakephp3

1 2use App\config\app; 3 4 5 6class ProcsShell extends Shell 7{ 8 public function main() 9 { 10 parent::initialize(); 11 $this->loadModel('Users'); 12 } 13}

こちらを実行させると下記のようなエラーメッセージが出ます。
config/app.phpが走っておらず、defaultクラスがないと怒られているようです。

Datasource class default could not be found. in [/home/ubuntu/workspace/xxxxx/vendor/cakephp/cakephp/src/Datasource/ConnectionRegistry.php, line 57]

config/app.php

'Datasources' => [ 'default' => [ 'className' => 'Cake\Database\Connection', 'driver' => 'Cake\Database\Driver\Mysql', 'persistent' => false, 'host' => "xxxxx", 'username' => "xxx", 'password' => "xxxxx", 'database' => "xxxxxxx", 'encoding' => 'utf8', 'timezone' => 'Asia/Tokyo', 'cacheMetadata' => true, 'quoteIdentifiers' => false, ],

config/app.phpが実行されていないようなのですが
useの使い方が間違っているのでしょうか?

よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

同じコードを自分の環境で実行しても、同じようなエラーにならないですね
ちなみに、**use App\config\app;**という宣言はいらないです。内部で勝手に実行してくれています。
またparent::initialize();の処理もinitializeをオーバライドしていないなら、明示的に実行する必要はありません。コードは上記ですべてでしょうか。処理が他にあるのでしょうか。

もっともシンプルなシェルを書いてみたので実行してみてもらえますか

php

1<?php 2namespace App\Shell; 3 4use Cake\Console\Shell; 5 6class ProcsShell extends Shell 7{ 8 public function main() 9 { 10 $this->loadModel('Users'); 11 debug($this->Users->find()->limit(5)); 12 } 13}

(追記) 10/5 6:36

同じエラーを再現させることができました。
※app.phpのDatasources.default.classNameの設定を削除すると発生しますね

php

1 'Datasources' => [ 2 'default' => [ 3 //'className' => 'Cake\Database\Connection', // これがないとおきる 4 'driver' => 'Cake\Database\Driver\Mysql',

投稿2016/10/04 20:59

編集2016/10/04 21:40
popobot

総合スコア6586

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

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

WADA1234

2016/10/04 21:13

icchiiさん いつもご教授いただきありがとうございます。非常に助かります。 >同じコードを自分の環境で実行しても、同じようなエラーにならないですね するとどこかのコードを書き換えてしまっている可能性がありますね。 >コードは上記ですべてでしょうか。処理が他にあるのでしょうか。 useで幾つか宣言しておりましたが、一度全て消しicchiiさんの例へ変更し実行を致しました。 >$this->loadModel('Users'); で、エラーとなりdebugまでいけてないようです。 下記がエラーの明細です。 Exception: Datasource class default could not be found. in [/home/ubuntu/workspace/xxx/vendor/cakephp/cakephp/src/Datasource/ConnectionRegistry.php, line 57] 2016-10-04 21:04:39 Error: [Cake\Datasource\Exception\MissingDatasourceException] Datasource class default could not be found. Exception Attributes: array ( 'class' => 'default', 'plugin' => NULL, ) Stack Trace: #0 /home/ubuntu/workspace/xxxxx/vendor/cakephp/cakephp/src/Core/ObjectRegistry.php(91): Cake\Datasource\ConnectionRegistry->_throwMissingClassError('default', NULL) #1 /home/ubuntu/workspace/xxxxxx/vendor/cakephp/cakephp/src/Datasource/ConnectionManager.php(202): Cake\Core\ObjectRegistry->load('default', Array) #2 /home/ubuntu/workspace/xxxxx/vendor/cakephp/cakephp/src/ORM/Locator/TableLocator.php(171): Cake\Datasource\ConnectionManager::get('default') #3 /home/ubuntu/workspace/xxxxx/vendor/cakephp/cakephp/src/Datasource/ModelAwareTrait.php(114): Cake\ORM\Locator\TableLocator->get('Users') #4 /home/ubuntu/workspace/xxxxxx/src/Shell/ProcsShell.php(28): Cake\Console\Shell->loadModel('Users') #5 [internal function]: App\Shell\ProcsShell->main() #6 /home/ubuntu/workspace/xxxxx/vendor/cakephp/cakephp/src/Console/Shell.php(456): call_user_func_array(Array, Array) #7 /home/ubuntu/workspace/xxxxx/vendor/cakephp/cakephp/src/Console/ShellDispatcher.php(217): Cake\Console\Shell->runCommand(Array, true, Array) #8 /home/ubuntu/workspace/xxxxx/vendor/cakephp/cakephp/src/Console/ShellDispatcher.php(181): Cake\Console\ShellDispatcher->_dispatch(Array) #9 /home/ubuntu/workspace/xxxxx/vendor/cakephp/cakephp/src/Console/ShellDispatcher.php(127): Cake\Console\ShellDispatcher->dispatch(Array) #10 /home/ubuntu/workspace/xxxxx/bin/cake.php(33): Cake\Console\ShellDispatcher::run(Array) #11 {main}
popobot

2016/10/04 21:33

あれ? app.phpのDB設定ってurlを使ってませんでしたっけ?? 前の質問でそういう話になったような? 現状は、質問文のような設定間違いないですか?
WADA1234

2016/10/08 04:30

コメント遅くなり、申し訳ございません。 色々いじり、cakephpの設定が変わってしまっているのではないかと思い いちから入れ直しました。結果、同様のエラーでした^^; はい!前回のときは、 環境変数に値が入っていたためurlを使用しておりました。 今回は環境変数に値が入っていなかったためurlを使用しませんでした。 ①class ProcsShell extends Shell { public function main() { ConnectionManager::config('default', [ 'url' =>'mysql:xxxx', ]); } } ②class ProcsShell extends Shell { ConnectionManager::config('default', [ 'username' => 'bxxxxx', 'password' => 'xxxxx', 'host' => 'xxxxx', 'database' => 'xxxxxx', 'scheme' => 'mysql', 'driver' => 'Cake\Database\Driver\Mysql', 'name' => 'default' ] ); } と①と②プログラムを変え、実行致しました。 エラーは相変わらず出てきます。 Exception: Cannot reconfigure existing key "default" in [/home/ubuntu/workspace/myapp/vendor/cakephp/cakephp/src/Core/StaticConfigTrait.php, line 98] defaultが再設定できないとでます。 エラーを追っていくと下記のディレクトリを参照しているようで *****を正しい値に変更すると動くようになりました。 vendor/cakephp/src/Database/Connection.php ・初期の設定 public function __debugInfo() { $secrets = [ 'password' => '*****', 'username' => '*****', 'host' => '*****', 'database' => '*****', //'port' => '*****' ]; ・ ・ ・ ・変更後の設定 public function __debugInfo() { $secrets = [ 'password' => '正しい値', 'username' => '正しい値', 'host' => '正しい値', 'database' => '正しい値', //'port' => '*****' ]; と変更すうるとコネクションが作成できました。 まだちゃんと動きを理解出来ていないのですが、、、 もう少しプログラムをおってみようと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問