2015.11.11
0からはじめるPHP#55【TDDで作り直す掲示板#3-データ共有とヘルパー関数によるテストバグ解決-】
まず最初に
愚痴を言わせてください。
家庭教師がクビになりました。
・・・・・・というと語弊があるので正確に言いますと
今年いっぱいで終了ということになります。
大丈夫です。
決してJKに手を出して即日解雇とかそんなんじゃないんで。
僕はこの家庭教師しかバイトをやってないんですが、このバイトで固定費を賄ってたんですね。
しかしこのバイトが消えることにより
ポケットマネーから月に1万円ずつ消えていくっていうことを意味します。
マズいですね。
ということで、否が応でも計画を早めねばなりません。
金の方は
最悪治験行けばなんとかなるんですが、それでもやはり固定収入と呼べるものは欲しいところです。
来年からは奨学金が使えるはずですが
学部で留年してた場合貰えるのかどうかもはっきりしないので、正直アテにはできないというか、まぁ最悪どうにかするしかないんですけど油断は禁物です。
奨学金という名の借金なワケですし、給付型なら当然ですけど貸与なんだったら別にいいじゃんねぇ?とか思っちゃうんですけどね
まぁ悪いのは自分です。
文句ならクソ記事を量産してた当時の自分に言いましょう。(自己暗示)
まぁ、ここで普通の人はバイトしないと!とか考えるワケですが僕はあまりそういう実にならないことはしたくないのです。労働というのは最終手段であるべきです。
ということで、この前も言ったような気もしますが、この
自分で金を生み出す為のスキルを身につけることを最優先します。とりあえず当面の目標は広告収入です。
ってことで、お勉強しなくてはいけないので、日記もそれ関連の話を当分続けていきたいなと思います。
で、今日の話題ですが、一つにまとめられないので垂れ流します。
1.全ビューでデータ共有
これは
app/Providers/AppServiceProvider.phpを触ればできるそうです。
<?php
namespace App\Providers;
class AppServiceProvider extends ServiceProvider
{
/**
* アプリケーションサービスの初期処理
*
* @return void
*/
public function boot()
{
view()->share('key', 'value');
}
/**
* サービスプロバイダー登録
*
* @return void
*/
public function register()
{
//
}
}
これで共通のデータをここにまとめておくことができます。コントローラーには書けないみたいですね。
ちなみに、ここで定数をdefineするとコントローラーでも使えるっぽいので、もう少し見やすくしたい方は定数宣言をこのファイルにしておきましょう。
外部ファイルにしてincludeした方が見やすいんですが
何故かテストするとバグるので諦めましょう。
2.ヘルパー関数の追加
ヘルパー関数自体は今までも
url()とか使ってるんですが、自分で定義することもできます。
何が嬉しいかって
ビューでもコントローラーでも使えるってところなんですね。
あと、ビューの方で関数を定義すると
これまたテストで多重定義エラーが出るんで、外部に退避させる必要があるんですね。
ぶっちゃけテストが足かせになってます。
フレームワークがどのようにして動いているのかを垣間見れるのは良いことなのですが、やはりとてもめんどっちいですね。でもやるしかありません。
ただ、これもそんな難しくないです。
まず
app/Httpに
helper.phpを作ります。一応書きましたけど、場所は実際どこでもいいと思います。
<?php
function display($d){
echo <<< EOM
名前:{$d->name}<br>
メール:{$d->mail}<br>
件名:{$d->title}<br>
URL:{$d->url}<br>
本文:<span style="color:#{$d->color};">{$d->content}</span><br>
時間:{$d->Datetime}<br>
EOM;
}
?>
今回私が作るヘルパー
display($obj)はこんな感じです。調子乗って
ヒアドキュメントなんか使っちゃってます。実はちゃんと使うのは初めてです。
これをビューの方からオブジェクトを入れて呼び出せばめでたく記事が表示されるというわけですね。
次にルートフォルダにある
composer.jsonに追記します。
{
...
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App": "app/"
},//<-- 忘れない
"files": ["app/Http/helper.php"] //<-- 追加
},
...
}
関係ないですがjsonってたぶんジェイソンって読むんでしょうけど、これはもともと何の略なんでしょうね。
と思って調べてみると
JavaScript Object Notationのことらしい。
最後にコマンドプロンプトでこいつを実行します。
これでオートローダーがきちんと動くようになるみたいです。何が起こってるかは知りません。やれって言われてるんでやりましょう。
@foreach($parents as $parent)
<div>
<?php $data=DB::table($BBS_CONTENT)->where("content_id",$parent->FK_main_id)->get();?>
~~~~~~~~~~~~~~~~~~~~~<br>
{{display($data[0])}}
<?php $children=DB::table($BBS_CONTENT)->where("parent_id",$data[0]->content_id)->orderBy("Datetime", 'asc')->get();?>
@foreach($children as $datac)
<br>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><br>
<br>
{{display($datac)}}
@endforeach
<a name="reply" href="{{url('./reply/'.$data[0]->content_id)}}">返信</a><br>
<a href="{{url('./reply/'.$data[0]->content_id)}}?quote=true">引用返信</a><br>
~~~~~~~~~~~~~~~~~~~~~~~~~<br>
</div>
@endforeach
実際にはこんな風に使えます。このヘルパー関数を使ってるのは6行目と12行目です。
それぞれ対応するオブジェクトを引数とすることで同じフォーマットで埋め込むことができます。
3.テストエラーの解決
ずっと足を引っ張ってるテスト君ですが、着々と解決法を見つけております。
/*返信の表示*/
public function testReply()
{
$this->visit('/')
->click("reply");
}
今回挑戦するテストとしてはこんなやつです。
トップページにアクセスして「reply」をクリックする、というアクションです。
まず前回に
日本語のリンクが踏めないっていう話をしましたが、強引ですが
name属性をつけることで解決します。
<a name="reply" href="{{url('reply/'.$data[0]->content_id)}}">返信</a><br>
こうするワケです。
これで日本語でありながらバグらないテストが行えます。name属性なんてテスト以外には使わないのでテキトーに設定して良いかと思われますが、重複したらどんな挙動を示すんでしょう。全部の組み合わせをやってくれるのかなぁ・・・・・・?
@extends('template')
@include('form')
@section('content')
@yield('form')
@foreach($parents as $parent)
{{display_sled($parent->FK_main_id,TRUE)}}
@endforeach
@endsection
ちなみに、現時点でのメインページのBladeテンプレートはこうなっています。
どういうことかというと
IDを渡せばスレ全体を表示するっていうヘルパー関数を作りました。
どういう実装になっているかは別に見せるほどのことでもないのですが、スレ表示は返信画面とかでも使うんで、これで返信画面の実装もチョロリーヌになったわけですねぇ!?(何)
次に何を話すかは未定ですが、頑張ります。