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

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

ただいまの
回答率

88.36%

アクセスデバイスがスマホ以外の場合、スマホ利用案内画面へ飛ばしたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 963

hyou

score 10

いつもお世話になっております。

現在、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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

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 () {
  // スマホのときに表示するルートを記述
}

のように実装するのが良いでしょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/26 17:35 編集

    Kosuke_Shibuyaさん

    ご回答頂き有難う御座います。
    ただ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-7.rpm
    じゃなくて
    rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
    にすればできるでしょ?

    あと、初めから自分の環境は質問文に記述しておいてください。

    それにしても、キーワードに「CentOS6 php7 インストール」とかで検索すれば、正しい情報探せると思います

    キャンセル

  • 2019/09/27 02:03 編集

    Kosuke_Shibuyaさん
    有難う御座います、うっかりしておりました、インストール正常に完了しました。
    また詳細なご回答有難う御座います。

    ご助言頂きました通りにやってみましたがやはり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メソッドが正しく動作しているのかなど、調査できることはしています?
    ただできませんでしたでは、代わりに作れと言われているようなので困ります。

    キャンセル

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

  • ただいまの回答率 88.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る