Laravel Livewire の public プロパティの注意点(その1)
前書き
やや日本では出遅れている感のある 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弾もあります。
Discussion
Laravel Livewire 基礎講座はもう購入できないのでしょうか?
宣伝の記載があったのにリンク切れですいません。今現在、購入いただけません。
Livewire Ver.2 の時に作成した動画だったのですが、その後 Ver.3 が発表されて、かなり進化してしまった為、混乱を避けるためにも Ver.2 の講座は閉鎖させていただきました。🙇♂️
今の所、Ver.3 での作成の予定は無いありませんが、もし将来公開された際には、よろしくお願いします🙇♂️
Ver.3はかなり重いですよね。
もしVer.3が公開されたときは、かならず購入します。
P.S.
Laravel11の基礎講座とてもありがたいです。
ありがとうございます。
そう言っていただけると嬉しいです😊