のぐそんブログ

暗いおじさんがシコシコ書くブログです。

Laravelでrouteの便利な指定の仕方のメモ

routeの便利な指定の仕方のメモです。

middlewareをまとめて割り当てる

middleware設定割り当てる場合以下のようにしますが、ルートグループを利用することで、まとめて割り当てることができます。

普通の書き方
Route::get('/Hoge', 'HogeController@index')->middleware(HogeMiddleware::class);
Route::get('/Hoge/other', 'HogeController@show')->middleware(HogeMiddleware::class);
まとめて割り当てる
Route::middleware([HogeMiddleware::class])->group(function () {
    Route::get('/Hoge', 'HogeController@index');
    Route::get('/Hoge/other', 'HogeController@show');
});

名前空間をまとめて割り当てる

特定の用途に利用しているControllerなどをディレクトリ単位でまとめた場合に、groupでルート設定を行うと便利。

例えば動物関連のコントローラーをまとめたAnimalディレクトリがあるとします。

普通の書き方
 Route::get('/animal', 'Animal\AnimalController@index');
 Route::get('/animal/dog', 'Animal\DogController@show');
まとめて割り当てる
Route::namespace('Animal')->group(function () {
    Route::get('/animal', 'AnimalController@index');
    Route::get('/animal/other', 'DogController@show');
});

ディレクトリが深い場合は便利なきがします。

ルートパラメーターとモデルのインスタンスを結合する

ルートにidを連携することで、該当するモデルのインスタンスを簡単に取得することができます。

usersテーブルからrouteで連携したidのモデルインスタンスを取得してみます。

普通に書くと(素人なので普通じゃなかったらすみません)
◎ /routes/web.php
Route::get('/hoge/{user}','HogeController@index');
◎ app/Http/Controllers/HogeController.php
    public function index($id)
    {

        $data = [
            'msg' => User::where('id',$id)->first(),
        ];

        return view('hoge.index', $data);
    }
◎/routes/web.php
Route::get('/hoge/{user}','HogeController@index');
◎ app/Http/Controllers/HogeController.php
<?php

namespace App\Http\Controllers;

use App\Person;
use Illuminate\Http\Request;

class HogeController extends Controller
{
    public function index(User $user)
    {
        $data = [
            'msg' => $user,
        ];

        return view('hoge.index', $data);
    }
}

どちらも、http://localhost/hoge/2でアクセスすると、以下のようなデータが取得できます。

{"id":2,"name":"fuga","mail":"fuga@example.com","age":20}

AWS超初心者のメモその3 ~WEBサーバーソフトをインストールする~

インスタンスを作成することはできたので、次はインスタンスにソフトをWebサーバーをインストールしてみようと思います。

インスタンスSSH接続する

サーバーにソフトをインストールする為に、インスタンスに接続する必要があります。
以下のコマンドで接続します。

// my-key.pem ・・・ インスタンス作成の際に作ったキーペア
// ec2-user@XX.XXX.XXX.XXX ・・・ 接続するユーザー名@インスタンスのIPアドレス

ssh -i my-key.pem ec2-user@XX.XXX.XXX.XXX

接続時に以下のメッセージが表示される場合があります。
これは初回アクセス時に表示されます。

The authenticity of host 'sshsvr (192.168.0.1)' can't be established.
RSA key fingerprint is 28:d2:80:56:a3:3c:bf:5b:58:f6:68:97:7d:7d:68:db.
Are you sure you want to continue connecting (yes/no)? yes

また以下のエラーが表示される場合があります。 これは、キーペアファイルが他のユーザーにも見れる状態になっているからです。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'my-key.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "my-key.pem": bad permissions
ec2-user@XX.XXX.XXX.XXX: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

以下のコマンドで自分だけが読めるようにパーミッションを変更します。

chmod 400 my-key.pem    

接続できると以下のような感じになります。

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
16 package(s) needed for security, out of 30 available
Run "sudo yum update" to apply all updates.

待ち受けているポート番号を確認

サーバーにログインした状態で以下のコマンドを実行します。

// 最後のPは大文字です
sudo lsof -i -n -P

LISTEN    ・・・ 他のコンピュータからの待受をしているポート ESTABLISHED ・・・ 相手と通信中のポート

COMMAND    PID     USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
rpcbind   2684      rpc    6u  IPv4   16722      0t0  UDP *:111
rpcbind   2684      rpc    7u  IPv4   16726      0t0  UDP *:724
rpcbind   2684      rpc    8u  IPv4   16727      0t0  TCP *:111 (LISTEN)
rpcbind   2684      rpc    9u  IPv6   16728      0t0  UDP *:111
rpcbind   2684      rpc   10u  IPv6   16729      0t0  UDP *:724
rpcbind   2684      rpc   11u  IPv6   16730      0t0  TCP *:111 (LISTEN)
chronyd   2690   chrony    1u  IPv4   16985      0t0  UDP 127.0.0.1:323
chronyd   2690   chrony    2u  IPv6   16986      0t0  UDP [::1]:323
dhclient  2894     root    6u  IPv4   17509      0t0  UDP *:68
dhclient  3025     root    5u  IPv6   17833      0t0  UDP [fe80::4cc:c3ff:feb5:4782]:546
master    3159     root   13u  IPv4   18690      0t0  TCP 127.0.0.1:25 (LISTEN)
sshd      3324     root    3u  IPv4   19944      0t0  TCP *:22 (LISTEN)
sshd      3324     root    4u  IPv6   19946      0t0  TCP *:22 (LISTEN)
sshd     22733     root    3u  IPv4 1298034      0t0  TCP 10.0.1.10:22->218.221.62.236:62426 (ESTABLISHED)
sshd     22751 ec2-user    3u  IPv4 1298034      0t0  TCP 10.0.1.10:22->218.221.62.236:62426 (ESTABLISHED)
sshd     22872     root    3u  IPv4 1299647      0t0  TCP 10.0.1.10:22->222.186.30.152:19459 (ESTABLISHED)
sshd     22873     sshd    3u  IPv4 1299647      0t0  TCP 10.0.1.10:22->222.186.30.152:19459 (ESTABLISHED)

Apacheをインストール

Webサーバー用のソフトであるApacheをインストールします。

// -yオプションはユーザーの確認なしで実行する指定
sudo yum -y install httpd

Apacheを起動

$ sudo systemctl start httpd

起動を確認する。
active:runningになっていればOKです。

$ sudo systemctl status httpd

システム起動時に毎回起動するように設定する。

$ sudo systemctl enable httpd

自動起動がONになっているかチェック

$ sudo systemctl is-enabled httpd

正しく構成されたらかをチェック

systemctl list-dependencies httpd

ポートを確認する

sudo lsof -i -n -Pを実行すると、80ポートの状態を確認できます。

・・・ 省略 ・・・
httpd    22968     root    4u  IPv6 1301813      0t0  TCP *:80 (LISTEN)
httpd    22969   apache    4u  IPv6 1301813      0t0  TCP *:80 (LISTEN)
httpd    22970   apache    4u  IPv6 1301813      0t0  TCP *:80 (LISTEN)
httpd    22971   apache    4u  IPv6 1301813      0t0  TCP *:80 (LISTEN)
httpd    22972   apache    4u  IPv6 1301813      0t0  TCP *:80 (LISTEN)
httpd    22973   apache    4u  IPv6 1301813      0t0  TCP *:80 (LISTEN)

ブラウザでWebサーバーにアクセスする

インスタンスのパブリックIPでブラウザから表示できるか確認します。
ただし、80ポートがファイアウォールでブロックされているので接続することができません。

port 22 ------------> ○ sshd 
port 80 ------------> × httpd

ファイアウォールの設定はセキュリティグループで行います。

80番ポートを開ける

セキュリティグループを開きます。
変更したいセキュリティグループを選択して、「インバウンド」タブを選択します。
そして「編集」ボタンを押します。

「ルールの追加」ボタンを押して、以下のように設定します。 ※タイプでHTTPを選択してもOK.

ブラウザで表示

これで80番ポートが開放されたので、ブラウザでパブリックIPにアクセスしてみます。