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

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

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

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

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

パラメータ

関数やプログラム実行時に与える設定値をパラメータと呼びます。

Q&A

4回答

3299閲覧

LaravelのURLでユーザーのid以外をパラメータに使いたい。

toyop

総合スコア30

Laravel

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

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

パラメータ

関数やプログラム実行時に与える設定値をパラメータと呼びます。

0グッド

0クリップ

投稿2021/11/26 14:45

Laravelを使ってウェブアプリケーションを作っています。

現在、ユーザーが登録した写真などを表示するマイページのURLのパラメータに、ユーザー登録時にauto incrementで自動的に生成されるidを使っています。 
例)localhost8000/example/5

ユーザー登録時にidとは別にランダムで文字列(random)を生成するようににしたのですが、このrandomの方をパラメーターに使いたいです。

ユーザーのidで指定する場合は以下のコードのようになっています。
web.php

php

1Route::get('/menu/{user}', 'CartController@menu');

CartController.php

pho

1public function menu($user) 2 { 3 $user = User::findOrFail($user); 4 return view('new_menu')->with(['user' => $user, 'allergy_array']); 5 }

bladeファイルの方では$user->nameなどでユーザーの情報を表示しています。

パラメータをrandomにするとなるとrandomとユーザーのidをどこかで紐づけなきゃいけないよなと思ったのですが、ここでやり方がわからなくなってしまいました。また、ユーザーのコンテンツを表示するときにはid->user->nameみたいになるのか???と詰まってしまいました。

解決方法ご存知の方いらっしゃいましたら、ご教示いただけると幸いです。

よろしくお願いいたします。

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

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

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

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

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

skys215

2021/11/26 15:12

api_tokenの事ですかね?
toyop

2021/11/26 15:29

skys215さん またまたコメントありがとうございます。 APIトークンのことではなくて、 例えばユーザー(id=2)がログインしてアップロードした写真を、不特定多数が/mypage/2にアクセスするとユーザーのギャラリーを閲覧できるといったようなことです。 この/2の部分がシンプルすぎて心配になったのでランダムに生成した文字列で置き換えたいと思った次第です。
m.ts10806

2021/11/26 23:53

パラメータ要らんのでは。 ログインしてるならセッションにユーザ情報持ってるわけだし(既に回答ついてますが)
guest

回答4

0

マイページの

マイページなんだからログイン済みですよね?自分しか見れない情報なら
https://laravel.com/docs/8.x/authentication#retrieving-the-authenticated-userに書いてありますが、例示通りのコード使いましょう

php

1use Illuminate\Support\Facades\Auth; 2 3// Retrieve the currently authenticated user... 4$user = Auth::user(); 5 6// Retrieve the currently authenticated user's ID... 7$id = Auth::id(); 8

他人の情報も見たい、見せたいなら↓に書いてあるような感じでwherefirstを使う
https://readouble.com/laravel/8.x/ja/authentication.html

投稿2021/11/26 23:45

hentaiman

総合スコア6421

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

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

0

@kawaxさんの回答通り、{user:random}でカラムを指定できます。
ドキュメント:キーのカスタマイズ
web.php

php

1Route::get('/menu/{user:random}', 'CartController@menu');

別な方法もあります。
1.
結合解決ロジックのカスタマイズ

php

1//URL: example.com/menu/87xcuwer7sf 2 3//web.php 4Route::get('/menu/{user_rand}', 'CartController@menu'); //random=87xcuwer7sfのユーザー 5Route::get('/profile/{user}', 'CartController@menu'); //id=2のユーザー 6 7// RouteServiceProvider.php 8Route::bind('user_rand', function ($ran) { //<--$ranは87xcuwer7sfになります。もしuser_randじゃなくuserにしたら上書きされます。(下記の2.モデルファイルでデフォルトを上書きすると同じになります。) 9 return User::where('random', $ran)->firstOrFail(); 10});

2.モデルファイルでデフォルトを上書きする
キーのカスタマイズ

php

1// app/User.php 或いは app/Models/User.phpで 2/** 3 * モデルのルートキーの取得 4 * 5 * @return string 6 */ 7public function getRouteKeyName() 8{ 9 return 'random'; 10}

弱点は上書きするので、別のルートでidを通じてuserを捜索することはできません

php

1//URL: example.com/menu/87xcuwer7sf 2//URL: example.com/profile/2 (id) 3 4//web.php 5Route::get('/menu/{user}', 'CartController@menu'); //<--random=87xcuwer7sfのユーザー 6Route::get('/profile/{user}', 'CartController@menu');//<--random=2のユーザーになります

Controllerで取得する場合

php

1//CartController.php 2public function menu($user){ 3 dd($user); //87xcuwer7sf 4} 5 6public function menu(User $user){ 7 dd($user); // App\Models\Userオブジェクト 8} 9 10public function menu(Request $request){ 11 dd($request->route('user_rand')); // 87xcuwer7sf 12} 13 14public function menu(){ 15 dd(request()->route('user_rand')); // 87xcuwer7sf 16}

投稿2021/11/27 02:57

skys215

総合スコア910

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

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

toyop

2021/11/29 09:20

skys215さん 追加のアンサーありがとうございます。 kawaxさんとskys215さんに教えていただいた通りuser:randomとすることで解決いたしました。またルート結合以外の方法も教えていただきありがとうございます。そちらも調べてみます。 ありがとうございました。
guest

0

まずルートモデル結合を使えば$user = User::findOrFail($user);が不要。
URLのIDを元にUserモデルを取得するところまでLaravelが自動でやってくれてる。
こういうLaravelの便利な機能を理解するのが先に必要なこと。

public function menu(User $user) { return view('new_menu')->with(['user' => $user]); }

ルートモデル結合を理解していればデフォルトのidからrandomを使うようにカスタマイズすればいいと分かる。Laravel6では多分使えないけどバージョンを書いてないので最新バージョンしか想定しない。

Route::get('/menu/{user:random}', 'CartController@menu');

https://readouble.com/laravel/8.x/ja/routing.html#route-model-binding

ルートモデル結合を使わない場合はrandomからUserモデルを取得すればいいだけ。

public function menu($random) { $user = User::where('random', $random)->firstOrFail(); return view('new_menu')->with(['user' => $user]); }

投稿2021/11/26 23:46

kawax

総合スコア10377

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

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

toyop

2021/11/29 09:18

kawaxさん ご回答ありがとうございます。 ご教示いただいた通り、$user = User::findOrFail($user);を削除して、:randamを追記したら解決いたしました。ルートモデル結合について存じ上げていなかったので、これを機に勉強したいと思います。 ありがとうございました。
guest

0

二つ方法があります。

  1. Userテーブルに一列たす(hashなど)。ユーザーが新規登録の時に自動にhashを作成し保存する。アクセスの時はhashを探せばいい
  2. あるアルゴリズムを設計する。例えば、2をfhg$%jhgjhエンコードし、逆にfhg$%jhgjhを2にデコードするアルゴリズムを設計する。

投稿2021/11/26 16:15

skys215

総合スコア910

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

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

toyop

2021/11/26 17:10

skysさん Userテーブルに現在randomというカラムがあり、ユーザーが新規登録すると自動で32桁の文字列が生成されます。 ご教示いただいた1.の方法がこのrandomを探すということになるのかなと思ったのですが(違ったらごめんなさい)、web.phpとControllerでどうrandomを探す記述をすればよいのかがわからないです。
skys215

2021/11/27 02:59

改めて投稿しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問