🚧

Laravel Livewire の public プロパティの注意点(その1)

2022/03/04に公開
4

前書き

やや日本では出遅れている感のある Livewire ですが、今後徐々に使われていく予感がします。
という事で、Livewire の public プロパティについての注意点です。

本題

Livewire のコンポーネントでは、public と private/protected のプロパティには、決定的な違いがあります。特に気をつけたい違いとしては、public プロパティは、ユーザー側の手に渡るという点です。

日本語ドキュメントには、「重要な注意点」として、以下のように書いてあります。

「パブリックプロパティに保存したデータは、フロントエンドのJavaScriptで表示可能になります。そのため、機密性の高いデータは保存しないでください。」

機密性の高いデータと表現してあり、ユーザーに見られてはまずいデータは、public に設定してはいけない事が分かります。

ただ、もう少し解釈が必要で、「ユーザー側の手に渡る」以上、一見、機密性が高くないと思えそうなものでも、ユーザーにデータを改変されてはまずいものは、public に指定するとまずいです。

以下のわざとらしい例で見てみます。

<?php

namespace App\Http\Livewire;

use App\Models\Post;
use Livewire\Component;

class PostList extends Component
{
    public $limit = 10;

    public $direction = 'asc';

    public $select = ['id', 'title'];

    public function render()
    {
        return view('livewire.post-list', [
            'posts' => Post::query()
                ->select($this->select)
                ->take($this->limit)
                ->orderBy('id', $this->direction)
                ->get()
        ]);
    }
}

public の特性を理解していないと、ついつい上記のようにやってしまいがちです。流石に、select は無いかも知れませんが😅。

何が問題かと言うと、上記3プロパティとも、ユーザー側で簡単に改変できてしまいます。select を改変すれば、、、、辞めておきます。

これは、Livewire が悪いのではなく、元々そういう仕様ですので、ユーザー側の方で気をつけないといけません。

上記の場合、そもそもプロパティ化しないで直接書くか、又はプロパティにする必要がある場合は、private or protected にすれば回避できます。

(補足:一部のオブジェクト系については、public だからと言って改変できないものもあります)

以上です。

第2弾もあります。
https://zenn.dev/nshiro/articles/123391f83f3ee6

Discussion

hh_0509hh_0509

Laravel Livewire 基礎講座はもう購入できないのでしょうか?

nshironshiro

宣伝の記載があったのにリンク切れですいません。今現在、購入いただけません。
Livewire Ver.2 の時に作成した動画だったのですが、その後 Ver.3 が発表されて、かなり進化してしまった為、混乱を避けるためにも Ver.2 の講座は閉鎖させていただきました。🙇‍♂️
今の所、Ver.3 での作成の予定は無いありませんが、もし将来公開された際には、よろしくお願いします🙇‍♂️

hh_0509hh_0509

Ver.3はかなり重いですよね。
もしVer.3が公開されたときは、かならず購入します。

P.S.
Laravel11の基礎講座とてもありがたいです。

nshironshiro

ありがとうございます。
そう言っていただけると嬉しいです😊