You are here
Home > Posts tagged "ツール"

Debugbarで楽々デバッグ

以前に紹介した、Debugbar

私には、もうなくてはならないものになりました。対象の画面で実行されたDBのクエリーはすべて見ることができるし、セッションの中身の値も確認できる。

そして、もうひとつ、プログラムの中で自分が見たいという変数をdebug()のヘルパー関数で、以下のように使用すれば、


class UserController extends Controller
{
	public function getUpload()
	{
		return view('user/upload');
	}

	public function postUpload(Request $request)
	{
		debug($request->all());

		$file = $request->file('file');

		$filename = $file->getClientOriginalName();

		$request->file('file')->move(public_path('images'), $filename);
	}
}

以下の画面のように、バーで表示してくれます。

screen1

行をクリックすれば、詳細を表示します。

screen2

ユーザー認証(14)Debugbar

マルチ認証のトピックが続いていますが、同じブラウザを使用して「会員」と「管理者」の両方にログインしたらどうなるのでしょう?

ログインはブラウザのクッキーを使用して、サーバーのセッションと繋がっています。Laravelはそれぞれに違うセッション、違うクッキーを使用するのでしょうか?それとも同じセッションで違う情報を保持するのでしょうか?興味ありませんか?

ということで、便利なツールの紹介とともに、認証のセッションがどうなっているかチェックしてみましょう。

ここで紹介するツールはDebugarというLaravelのためのツールです。

これをインストールすると、画面下にDebugarの情報パネルが表示され、実行したLaravelの様々な情報を見ることができます。

例えば、以下は会員のログイン成功直後の画面ですが、実行したDBのクエリーを見ることができます。DBテーブルusersに対するクエリーがあります。

debugbar-login

このツールのインストールはとても簡単です(GitHubにリポあります)。

まず、以下を実行します。

composer require barryvdh/laravel-debugbar

composer.jsonが更新されライブラリがダウンロードされインストールされます。

次に、config/app.phpに以下を追加します。

...
   'providers' => [
...
       Barryvdh\Debugbar\ServiceProvider::class,
   ],

   'aliases' => [
...
      'Debugbar' => Barryvdh\Debugbar\Facade::class,
   ],
];

これで完了です。

先の会員ログインを実行では、DBのクエリーの情報を見ることができましたが、セッションはどうなのでしょう?

debugbar-session
赤丸の部分がセッションの情報を見るボタンです。そして赤の四角の部分が、会員が認証されていることを示す情報です。login-user..の部分です。

さて、同じブラウザでもう1つタブを作成して今度は、管理画面にログインしてみましょう。以下が、ログイン成功後のセッション値です。

debuggar-session2

値が増えていますね。しかし、今度は、login-admin..と違う名前となっていますね。

つまり、セッションの中でguardの値をセッションの変数名として使い分けているわけです。

アーティザンのティンカー

前回の投稿「ダーティーなレコード」で、DBレコードが更新されたかどうか、簡単に実験してチェックできるツールを紹介しましょう。

ララベルにはコマンドで実行できる強力なツール、その名もアーティザン(Artisan)があります。このアーティザン、Macを含めてUnix系の開発者には便利でこのうえないツール。しかも、複数のコマンドがあるわけでなく、1つのコマンドでオプションを変えるだけでいろいろなことができる優れもの。

$ php artisan list

とタイプすればたくさんのオプションのヘルプがでてきます。

さて、この中でとてもユニークなのが、今回紹介するTinker

$ php artisan tinker

Psy Shell v0.4.4 (PHP 5.5.25 - cli) by Justin Hileman
>>>

まず、Eloquentのモデルを利用してレコードを取ってきましょう.

>>> use App\Models\Product
=> false
>>> $product = Product::find(1)
=> <App\Models\Product #000000000db510bc000000004b81eec1> {
       product_id: 1,
       created_at: "2015-04-25 12:22:10",
       updated_at: "2015-08-05 13:15:25",
       name: "test product",
       price: "1000"
   }
>>>

次に、価格(price)を更新してみます。

>>> $product->price = "2000"
=> "2000"
>>> $porduct->isDirty()
=> true
>>> $product->save()
=> true
>>> $product
=> <App\Models\Product #000000000ee7a5b70000000066692faa> {
       product_id: 1,
       created_at: "2015-04-25 12:22:10",
       updated_at: "2015-08-11 09:33:23",
       name: "test product",
       price: "2000"
   }
>>>

isDirty()は変更されたのでもちろんtrue、また update_atも更新時の日時に更新されています。

今までのDBのクエリの履歴を見たいなら、

>>> DB::getQueryLog()
=> [
       [
           "query"    => "select * from `product` where `product`.`product_id` = ? limit 1",
           "bindings" => [
               3
           ],
           "time"     => 0.56
       ],
       [
           "query"    => "update `product` set `updated_at` = ?, `price` = ? where `product_id` = ?",
           "bindings" => [
               "2015-08-11 09:33:23",
               "2000",
               3
           ],
           "time"     => 3.13
       ]
   ]
>>>

さて、今度は同じ値を入れてみましょう。

>>> $product->price = "2000"
=> "2000"
>>> $product->isDirty()
=> false
>>> $product->save()
=> true
>>> $product
=> <App\Models\Product #000000000ee7a5b70000000066692faa> {
       product_id: 1,
       created_at: "2015-04-25 12:22:10",
       updated_at: "2015-08-11 09:33:23",
       name: "test product",
       price: "2000"
   }
>>>

レコードではダーティーではなく(false)、またsave()しているにもかかわらず、update_atの値にも変化ありませんね。

ここで、DB::geQueryLog()を実行すれば、さきとまったく同じ履歴が出てきます。つまり、DBの処理は何もなかったを証明します。

ティンカー便利ですね。ブラウザを使わなくとも、ユニットテストを書かなくても、ここでテストができるのが便利です。

追記:

今回のティンカーは、バージョン5.1のララベルを使用しています。他のバージョンでは、コマンドのプロンプトのシンボルが違ったりや行末のセミコロンの必須となったります。ご注意を。

Top