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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Q&A

解決済

1回答

1142閲覧

Laravelのバッチ作成ができない

mizuneko_4345

総合スコア4

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

0グッド

0クリップ

投稿2020/08/16 02:44

編集2020/08/16 07:08

実現したいこと

Laravelでバッチ作成

前提

AWSのEC2上で無料枠のCentOS7を選択し(ストレージを30GiB)インスタンスを作成しました。
次に、MySQL,Nginx,PHP,Laravelをそれぞれインストールしました。バージョンは以下です。

mysqld Ver 5.7.31 for Linux on x86_64
nginx/1.18.0
PHP 7.3.20
Laravel7

その後VSCodeのRemoteSSH機能を使って、サーバ側にWindows経由でSSH接続しました。

MySQLでDBを作成後、VSCodeでホストサーバにアクセスし、TestCommand.php内部を編集しました。

【TestCommand.php】 <?php namespace App\Console\Commands; use Illuminate\Console\Command; use App\Models\Player; class TestCommand extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'test_command'; /** * The console command description. * * @var string */ protected $description = 'Test Command'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return int */ public function handle() { $players = Player::get(); foreach($players as $player) { echo $player->name."\n"; } return 0; } }

php artisan test_commandをターミナル上で打ち込み、
DB上のサッカー選手名を表示させたいのですが、
以下のエラーが表示されます。

発生している問題・エラーメッセージ1

[centos@ip-xxx-xx-xx-xxx host]$ php artisan test_command  ErrorException Undefined index: driver at vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php:127 123| 124| // Next we will check to see if an extension has been registered for a driver 125| // and will call the Closure if so, which allows us to have a more generic 126| // resolver for the drivers themselves which applies to all connections. > 127| if (isset($this->extensions[$driver = $config['driver']])) { 128| return call_user_func($this->extensions[$driver], $config, $name); 129| } 130| 131| return $this->factory->make($config, $name); +10 vendor frames 11 app/Console/Commands/TestCommand.php:41 Illuminate\Database\Eloquent\Model::__callStatic("get", []) +14 vendor frames 26 artisan:37 Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput),  Object(Symfony\Component\Console\Output\ConsoleOutput))

試したこと

1.mysqlの停止・再起動

2.mysqlのパスワード変更(#を含んでおりエラーに関わると感じ!に変更)

3.DatabaseManager.phpの127行目の"driver"が未定義であるためエラーかと思いましたが、変更の仕方が分からない。

4.TestCommand.phpの41行目、"get", []部分の変更かと思いましたがこちらもいじらずそのままです。

発生している問題・エラーメッセージ2

[centos@ip-xxx-xx-xx-xxx host]$ php artisan optimize && php artisan route:cache Configuration cache cleared! Configuration cached successfully! Route cache cleared! LogicException Unable to prepare route [/] for serialization. Uses Closure. at vendor/laravel/framework/src/Illuminate/Routing/Route.php:1150 1146| */ 1147| public function prepareForSerialization() 1148| { 1149| if ($this->action['uses'] instanceof Closure) { > 1150| throw new LogicException("Unable to prepare route [{$this->uri}] for serialization. Uses Closure."); 1151| } 1152| 1153| $this->compileRoute(); 1154| +27 vendor frames 28 artisan:37 Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

試したこと

1.Route.phpの1150行目に何かしらの準備ができていない。
「Unable to prepare route [/] for serialization」に関しては、ルートの準備ができていないと記載されているが、どのような変更を施すべきか理解不能。

補足情報(FW/ツールのバージョンなど)

 

【開発環境】

Windows 10 Pro 64bit

Surface Pro 4

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/08/16 02:58 編集

centosっぽいことを示しておきながら、それに関わる情報が足りないとは。telnetなどで接続した先のサーバーなのか、Windows上に仮想OSとして立ち上げているのか、そもそもCentOSのバージョンは、なども明らかにするべきではないかと。Laravelのバージョン、5なのか4なのかも示したほうが良いかと。
mizuneko_4345

2020/08/16 03:18

貴重なご意見をいただきありがとうございます。質問事項に関して修正していきます。
phper.k

2020/08/16 03:43

デフォルトのLaravel には「php artisan test_command」など存在していません。 自作したコマンドなら、そのファイルの中身を提示してください。
guest

回答1

0

ベストアンサー

public function handle() { $players = Player::get(); foreach($players as $player) { echo $player->name."\n"; } return 0; }

ここの、Player::get() から発生しているエラーです。
get() でデータベースに接続するときに、if (isset($this->extensions[$driver = $config['driver']])) { ここを通るのですが、

$default に入ってくる値は、.env のデータベース接続情報と等しい値となります。

// 接続例 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=database DB_USERNAME=homestead DB_PASSWORD=secret

default のところは、DB_CONNECTION の値に当たります。
ここの値が設定されていなかったり、または .env が存在しているかを確認してください。

投稿2020/08/16 07:21

編集2020/08/16 07:21
phper.k

総合スコア3923

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

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

mizuneko_4345

2020/08/16 10:53

ご回答ありがとうございます。 DB_CONNECTIONは正常に設定されており、.envファイルも存在しているので 問題はなさそうに見えます。 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=xxxxxdb DB_USERNAME=root DB_PASSWORD="xxxxxxxx" かなりエラーに数日間悩まされているので、一度インスタンスを作り直す予定です。
phper.k

2020/08/16 12:11

それはどのように確認しましたか?
mizuneko_4345

2020/08/16 12:39

VSCodeでCentOS7にSSH接続し、ホストサーバ内の.envファイルを確認しました。 sudo vi .env .env内に上記の記載がありました。
phper.k

2020/08/16 13:04 編集

であれば、設定情報が間違っているのでしょう。 AWSではHost が127.0.0.1になることは通常ありませんので、おそらく間違っていると思います。 そんなはずはない!と疑うようでしたら、 ssh でログインした後、以下のコマンドで接続できるかどうか確認してください。 mysql -u root -h 127.0.0.1 --port=3306 -p{パスワード}
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問