いつもお世話になっております。
現在、Laravelにてスマホ用のユーザ認証ありのwebページを制作しております。
スマホ用ですので、他のデバイスからのアクセスに対しては「スマホを使用してください」と書かれたページへ飛ばしたいと思っております。
以下、コードによってtopページだけ実装できました。
(個人で試した限りできていそうですが、もしおかしな点ありましたらご指摘下さい)
しかしログイン画面を同じようにコーディングしたとしても例えばログインしていないユーザがurlを直接、編集してログインしていないと入れないページへアクセスした場合、loginページへ飛ばされます。
スマホの場合だとそのままlogin画面を表示するのでいいですが、PCから同様の操作をした場合、「Route [login] not defined.」とエラーが表示されてしまいます。
どうすればうまくルーティングできるか、知恵をお借りできないでしょうか?
なお下記、コード以外のやり方でも構いません。
//web.php
Auth::routes();
Route::get('/', function () {
return redirect('/top');
});
//top画面
Route::get('/top', function(){
$ua = $_SERVER['HTTP_USER_AGENT'];
// user agent が iPhone か iPod か Android の場合
if( (strpos($ua,'iPhone') !== false) || (strpos($ua,'Android') !== false) || (strpos($ua,'iPad') !== false)) {
return view('top');
}
else { // user agent が それ以外 (PC) の場合
return view('guide'); // PC版TOPを表示
}
});
//ログイン画面
Route::get('/login', function(){
$ua = $_SERVER['HTTP_USER_AGENT'];
// user agent が iPhone か iPod か Android の場合
if( (strpos($ua,'iPhone') !== false) || (strpos($ua,'Android') !== false) || (strpos($ua,'iPad') !== false)) {
Auth::routes(['verify' => true]);
}
else { // user agent が それ以外 (PC) の場合
return view('guide'); // PC版TOPを表示
}
});
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
jenssegers/agent というユーザーエージェントのライブラリがあるので、これを使い、
https://github.com/jenssegers/agent
composer require jenssegers/agent
middleware で判定部分を実装します。
php artisan make:middleware CheckSmartPhone
上記のコマンドで以下のファイルが生成される
<?php
/**
* app/Http/Middleware/CheckSmartPhone.php
*/
namespace App\Http\Middleware;
use Closure;
class CheckSmartPhone
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $next($request);
}
}
これに、以下のように実装して
<?php
namespace App\Http\Middleware;
use Closure;
use Jenssegers\Agent\Agent;
class CheckSmartPhone
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ((new Agent())->isMobile()) {
return redirect('non-smart-phone', 403);
}
return $next($request);
}
}
app/Http/Kernel.php
へミドルウェアの短縮キーを登録した上で、
https://readouble.com/laravel/5.8/ja/middleware.html
Route::middleware(['is_smartphone'])->group(function () {
// スマホのときに表示するルートを記述
}
のように実装するのが良いでしょう。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2019/09/26 17:35 編集
ご回答頂き有難う御座います。
ただjenssegers/agentをインストールしようとしたところ、下記の通りCent OSのアップデートが必要な状況になりました。
ちょっと敷居が高くもしほかに方法がありましたら、ご教示頂きたく思います。
「composer require jenssegers/agent」を入力
↓
php を7.2へあげろ、といわれる
↓
phpをアップデートするために
「rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm」
を押下
↓
epel-releaseのver 7が必要と言われる
↓
OSがCent OS6の為、7.xをインストールしても使用できない=Cent OS7へのアップデートが必要。。。
2019/09/26 17:36 編集
じゃなくて
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
にすればできるでしょ?
あと、初めから自分の環境は質問文に記述しておいてください。
それにしても、キーワードに「CentOS6 php7 インストール」とかで検索すれば、正しい情報探せると思います
2019/09/27 02:03 編集
有難う御座います、うっかりしておりました、インストール正常に完了しました。
また詳細なご回答有難う御座います。
ご助言頂きました通りにやってみましたがやはりPCでも普通にアクセスできてしまいました。
ご回答頂いたコードを記載し、
app/Http/Kernel.phpに
protected $routeMiddleware = [
'is_smartphone' => \App\Http\Middleware\CheckSmartPhone::class,
];
と記載し、web.phpで
Route::middleware('is_smartphone')->group(function (){
Auth::routes();
Route::get('/top','Controller@top');//top画面
Route::get('/', function () {
return redirect('/top');
});
});
としPCからtop画面へアクセスしましたが普通に表示されてしまいます。
もしお時間が御座いましたらもう少しお時間頂きたく。。。
2019/09/27 03:15 編集
自分もこの知識身につけるのには時間かかってんですから。
試行錯誤あるのみ。
判定がおかしいことは明らかなのだから、isMobileメソッドが正しく動作しているのかなど、調査できることはしています?
ただできませんでしたでは、代わりに作れと言われているようなので困ります。