wonTech

プログラミングもろもろ

バリデーション失敗時にカスタムメッセージを表示させる

通常のバリデーション

$data = Input::all();
$rules = array( 'title' => 'required', 'content' => 'required|max:200')

$validator = Validator::make($data, $rules);

if($validator->fails()){
  return Redirect:action('hogeController@create')->withErrors($validator) 
}

これだと$errorを遷移先のビューで表示させた場合英語のエラーメッセージがそのまま出る。
日本語でエラーメッセージを表示させたいときはValidator::makeの第三引数にカスタムメッセージを指定する。

$data = Input::all();
$rules = array( 'title' => 'required', 'content' => 'required|max:200') 
$message = array('title' => 'タイトルを入力してください');
$validator = Validator::make($data, $rules, $message);

if($validator->fails()){
  return Redirect:action('hogeController@create')->withErrors($validator) 
}

特定フィールドのバリデーションルールにメッセージを指定したい場合は.でフィールド名とルールを繋げて指定する。

$message = array('content.required' => '内容を入力してください');

これでcontentフィールドのrequiredチェックが失敗した時だけカスタムメッセージを表示できる。
(titleフィールドのrequiredチェックに失敗したときはデフォルドのメッセージが表示される)

routes.phpの先頭におまじないを追加するとルーティングが便利になる(らしい)

ネタ元はcode bright。

Laravel: Code… Dayle Rees 著 et al. [Leanpub PDF/iPad/Kindle]

例えば蔵書の管理アプリを作るとして、本の情報を登録するbooksテーブルとそれに紐付いたBookモデルが既に存在する場合
routes.phpの先頭に以下の行を追加する。

// routes.php
Route::model('book', 'Book'); // これを追加

// ここから通常のルート処理
Route::get('/', 'hogehogeController@index');
......

この行は「最初の引数が、2つ目の引数で指定されたモデルのインスタンスとして使用できる」ことを意味する(らしい)
例えばroutes.php内で

Route::get('/edit/{book}', 'hogehogeController@edit');

とすると、{book}の位置に整数がセットされた時に
それを主キー(idとか)として自動でテーブルから適合するデータを引っ張ってきてくれる(らしい)
便利ですね〜
データの更新や削除処理を書くとき捗りそう

.css,.jsファイルが読み込めなかった問題の原因

わかってみれば初歩的なミスだった。原因はパスの記述ミス。

前に貼ったアプリを作ったとき、css・jsファイルのどちらもpublic以下に専用フォルダを作ってそこに入れていた。

// style.cssの場所
/public/css/style.css
//test.jsの場所
/public/js/test.js

これを読み込むためにlayout.blade.phpで下のように書いていた。

// layout.blade.php
<!doctype html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>BBS</title>
	{{ HTML::style('public/css/style.css') }}
        {{ HTML::script('public/js/test.js') }}
</head>
. . . .

HTML::script、HTML::styleどちらも、相対パスを書くときはベースURLが

localhost/laravel4/public

になるため、実際にはをpublic以下のパスを書かないといけないみたいだ。つまり、上のコードの場合

{{ HTML::style('css/style.css') }}
{{ HTML::script('js/test.js') }}

と書けば読み込めた。
HTML::styleでなくタグにasset()を埋め込むやり方の場合も同様のようです。

参考:
HTML::style()メソッド | WinRoadのLaravel4初心者講座
Laravel-Bladeを試してみた | Shimabox Blog

laravelで超簡単な掲示板アプリを作った

// routes.php
Route::any('/', function()
{
	// フォームで入力された情報を取得
	$name = Input::get('name', 'No name');
	$content = Input::get('content');

	// 入力された情報をテーブルに書き込む
	$p = new Post;
	$p->name = htmlspecialchars($name);
	$p->content = htmlspecialchars($content);
	$p->save();

	$posts = Post::orderBy('id', 'DESC')->get();

	return View::make('view_posts')->with('posts', $posts);
});
<!-- layout.blade.php -->
<!doctype html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>BBS</title>
</head>
<body>
	<h1>シンプル掲示板</h1>
		{{ Form::open(array('url' => '/')) }}
			{{ Form::label('name', 'name') }}
			{{ Form::text('name') }}
			<br>
			{{ Form::label('content', 'content') }}
			{{ Form::text('content') }}
			<br>
			{{ Form::submit('post!') }}
		{{ Form::close() }}
	</div>
	@yield('content')
	
</body>
</html>
<!-- view_post.blade.php -->
@extends('layout')

@section('content')
	@foreach($posts as $post)
		<p>{{ $post->name }}</p>
		<p>{{ $post->content }}</p>
		<p><small>{{ $post->created_at }}</small></p>
		
	@endforeach
@stop

勉強のために簡単なアプリを作ってみた。
更新すると空データが送信されたりするけど動けばいい。


これを作ってた際に直面した課題:


  • css , .jsファイルが読み込めない

bootstrapの使い方とajaxも勉強しようと思ってpublic直下に置いた.css,.jsファイルが読み込めなかった。

  • フォーム内の要素が改行されない

blade記法でラベル・テキストフィールドのセットを複数作ると改行されない。
軽くググってもそれらしい解決法は引っかからなかった。今回は間に
入れて誤魔化した。
もっとうまいやり方がたぶんあると思う。

とにかく動くものが欲しかったのでどちらも今回はスルーしたけど、明日以降また試してみる。
まだまだ先長いな。

「php artisan serve」 → Error in exception handler.

composerでcreate projectしたあとphp artisan serveすると表題のエラーが。

app/strageへアクセス権限が設定されていないのが原因っぽいので以下のコマンドで解決。

chmod -R 777 app/storage
chown -R :www-data app/storage


参考:

Laravel4でインストールした時に「Error in exception handler.」 - Ich lerne Laravel und CakePHP