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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

2293閲覧

Laravel5のresourceルーティングで、例外処理を実施する方法を教えて下さい

qwe001

総合スコア133

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2016/08/16 01:12

編集2016/08/16 05:38

Laravel5のルーティングでRoute::resourceにて書いた場合、
ルーティングとしては/hoge/{hoge}/edit のようなものが作られるかと思います。
この{hoge}にあたる部分を{id}にすることは可能でしょうか?
より具体的には、{hoge}にあたる部分への例外処理を実施する方法が知りたく、質問させて頂きました。

というのも、{hoge}の部分に1などの整数値が入っていればpsql文としては
select * from "hoge" where "hoge"."id" = 1 limit 1
のようなものが入るため、期待通りのページを出してくれますが、
ここにaaなどの文字列が入ってきた場合psql文としては
select * from "hoge" where "hoge"."id" = aa limit 1
が入ってくるため、idを正しく取得できず、psqlエラーが表示されます。

そこで、/hoge/1/editのようにURLに直打ちしたとして、
その1という値がデータベース上のidカラムに存在する場合はViewを返し、
存在しない場合は全てabort 404などするといったことをしたいのですが、
これはroute.phpに書くべき内容なのでしょうか?
また、書く場合にどのような条件分岐を書くと期待動作をするのかを教えて頂けますと幸いです。
どうぞよろしくお願いいたします。

追記

以下のようにすることで、期待動作をすることが可能だということがわかりました。

Route::get('/hoge/{hoge}/edit','TestsController@edit')->name('hoge.edit')->where('hoge','[0-9]+');

ということは、storeやupdateメソッドなどもこれで全部where文を書いていけば一旦問題は解決な訳ですが、これを次のようにResourceで使いたいです。

Route::resource('/hoge', 'TestsController')->where('hoge','[0-9]+');

しかし、これだとCall to a member function where() on nullと表示され、期待動作をしません。
おそらくindexにはidにあたる数値が入ってこないためこのエラーが発生しているものと思われます。
そこで、resourceを使うけどwhere文はindexのみを除外する、といった記述は可能でしょうか?
やっぱりgetやpostをいちいち全部書かないとダメでしょうか?

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。
どうやらResourceメソッドやControllerメソッドではWhereメソッドを使用することができないようですが、Patternメソッドは使用することができるようです。
なので以下のような正規表現を使用することで対応しました。

Route::get('/hoge/{hoge}/delete','TestsController@delete')->name('hoge.delete')->where('hoge','[0-9]+'); Route::pattern('hoge', '\d+'); // 数字のみを許可。[0-9]+と同じ Route::resource('/hoge', 'TestsController');

投稿2016/08/16 06:05

qwe001

総合スコア133

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問