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

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

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

Routerは、異なるネットワーク同士を相互に接続するための通信機器。インターネットでのデータを自動的に振り分け、一つのインターネット回線を複数のコンピュータで使用することが可能です。DHCPによりIPアドレスを自動的に割振りすることもできます。

Laravel

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

PHP

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

Q&A

解決済

2回答

3903閲覧

PHP Laravel route path指定について

kkkenn

総合スコア8

Router

Routerは、異なるネットワーク同士を相互に接続するための通信機器。インターネットでのデータを自動的に振り分け、一つのインターネット回線を複数のコンピュータで使用することが可能です。DHCPによりIPアドレスを自動的に割振りすることもできます。

Laravel

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

PHP

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

0グッド

0クリップ

投稿2018/08/28 08:59

編集2018/08/29 01:03

前提・実現したいこと

以下のような二つのパターンのrouteを通るようにしたい。


user/repo/branch
user/repo/branch/path1
user/repo/branch/path1/path2 (pathの部分は何個あっても可能)

下の二つだけなら
Route::get('/{user}/{repo}/{branch}/{path}','SearchController@show')->where('path','.*');
このようなroutingで通りますが一番上の場合(pathの部分がない場合)エラーになってしまいます。


user/repo/branch/path1/aaaa.html
user/repo/branch/path1/path2/aaaa.html
user/repo/branch/path1/path2/path3/aaaa.html

末尾のpathに@@@.@@@があった場合にrouteを通したい。
こちらもpathの部分は何個あっても大丈夫なようにしたいです。

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

上記のrouteの通し方がわからない。

試したこと


Route::get('/{user}/{repo}/{branch}/{path?}','SearchController@show')->where('path?','.*');
このように指定してみたがsyntaxエラー。

①だけを通すためなら
Route::get('/{user}/{repo}/{branch}/{path}','SearchController@show')->where('path','.*');
Route::get('/{user}/{repo}/{branch}/{path?}','SearchController@show');
とすればbranch以下のpathに何が来ても(user/repo/branchのような場合でも)通るようになりますが、
@@@@.@@@のpathが来た時もshowアクションが動くようになってしまいます。
@@@@.@@@の場合は違うアクションを動かしたいです。


Route::get('/{user}/{repo}/{branch}/{path}','SearchController@show')->where('path','.');
Route::get('/{user}/{repo}/{branch}/{path}.{ext}','SearchController@show')->where('path','.');

いずれも試しましたがどちらもうまくいきませんでした。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

前回 https://teratail.com/questions/142664 で回答したものです。

path がない場合もあるようでしたらルーティングを

Route::get('/{user}/{repo}/{args}','SearchController@show')->where('args','^(?!.*.html$).*$'); Route::get('/{user}/{repo}/{args}','SearchController@html')->where('args','.*');

などとし、コントローラー側で

public function show($user, $repo, $args) { $paths = explode('/', $args); $branch = array_shift($paths); // ... } public function html($user, $repo, $args) { $paths = explode('/', $args); $branch = array_shift($paths); // ... }

としてあげると $branch もうまく取得でき、path の部分が $paths に配列として格納されます。

そして末尾が .html の時は html メソッドを実行してくれるかと思います。

投稿2018/08/31 07:53

enomotodev

総合スコア27

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

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

kkkenn

2018/08/31 08:39

先日、今回共にご丁寧にありがとうございます。 うまくルーティングは組めていましたがコーディングが汚かったので参考にさせていただきます!
guest

0

ベストアンサー

ルートのwhere条件は、正規表現でチェックされていることを覚えれば、そこを工夫することでやりたいことが出来るようになりますよ!


user/repo/branch
user/repo/branch/path1
user/repo/branch/path1/path2 (pathの部分は何個あっても可能)

ルート指定はこれだけで充分だと思います。

Route::get('/{user}/{repo}/{branch}/{path?}','SearchController@show')->where('path','.*');

ルートパラメータ名の最後に付けた?は、「存在しない場合もあるよ」という目印のようなものなので、where条件のルートパラメータ名には含めなくて大丈夫です。


user/repo/branch/path1/aaaa.html
user/repo/branch/path1/path2/aaaa.html
user/repo/branch/path1/path2/path3/aaaa.html
末尾のpathに@@@.@@@があったは違うアクションを動かしたい。

※ @@@.@@@の前には1つ以上のpathがあるものとして話を進めます。

拡張子部分(.ドットより後ろ部分)が固定(あるいはパターンがある)ならば、それを条件にするのが良いと思うのですが、「@@@.@@@」は拡張子部分も変動する、ということでしょうかね・・?

routeの書き方はこんな感じだと思います。
※●●●部分は@@@.@@@で動かしたいアクションを指定してください

Route::get('/{user}/{repo}/{branch}/{path}/{file}.{ext}','SearchController@●●●')->where('path', '.*[^/]{1}$')->where('file', '[^./]+')->where('ext', '[^./]+'); Route::get('/{user}/{repo}/{branch}/{path?}','SearchController@show')->where('path','.*');

●●●のアクション(@@@.@@@のルート)の方は、
pathの条件は、/で終わらない
fileの条件は、.(ドット)と/を含まない
extの条件は、.(ドット)と/を含まないとなっています。

showのルートは、●●●のアクションのルート設定よりも後ろに書きます。
これで、●●●のアクションのルートにマッチしない「/{user}/{repo}/{branch}/~~~~」なものはshowで拾うことになります。

この指定で、
●●●アクションには、例えば、
user/repo/branch/path1/path2/aaaa.html でアクセスした場合、

{path} には "path1/path2" {file} には "aaaa" {ext} には "html"

が渡されるようになります。

★上記のルート指定での注意点★
先にも書きましたが、変じゃないかなー?と思うようなURLでも、
「/{user}/{repo}/{branch}/~~~~」の形であれば
showのルートに拾われますので、除外したいものがあれば、showの「path」のwhere条件(正規表現)を変える必要が出てきます。

変じゃないかな?と思うURLの例は、こんなの・・・

user/repo/branch/aaa.html ←path部分 がないとか
user/repo/branch/path1/aaa.html/path2 ← URLの順番がおかしいとか
user/repo/branch/path1/path2/.html  ← 拡張子部分だけあるとか
user/repo/branch/path1/path2/aaaa..html ← ドットがたくさんあるとか

※動作検証を最低限しかしていませんので、もしかしたら正規表現に考慮漏れや記述ミスがあるかもしれません。。。
その場合は、正しくあるべきURLを考えてみて、それに合うように正規表現を組み立てて試してください。

投稿2018/08/30 06:33

mix-peach

総合スコア1910

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

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

kkkenn

2018/08/31 08:40

大変丁寧な回答ありがとうございます! 正規表現の知識が足りていなかったので助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問