Help us understand the problem. What is going on with this article?

Laravel の「認可」

More than 1 year has passed since last update.

Kobito終了で本当にQiitaに書きにくい…。後から見直すこともあるので手元に残らないと困る。別のMarkdownメモアプリで書いてからコピペするテスト。

Laravel 5.4 におけるユーザ権限管理の実装に関する考察(途中まで) - s平面の左側

ユーザごとに「このデータは編集できる」「このデータは閲覧のみ可」といった権限管理をしたい。

Laravelにはまさにこれをやるための「認可」があるんだよ。
https://readouble.com/laravel/5.5/ja/authorization.html
追加されたのは…5.1の途中か。
https://readouble.com/laravel/5.1/ja/releases.html

確かに追加された当時は自分もよく分かってなくて使い出したのは5.4以降くらい。
「認証」と「認可」の違いが分からない。
英語でも AuthenticationAuthorization だからややこしい。

ログインしてる/してないが「認証」
ログインしてるユーザーごとに細かい権限を管理するのが「認可」

使い方は見れば分かるからいいか…。

LaravelのMVC

最初の記事みたいなことってMVCしか書いてはいけないと思ってるから発生するのかな?
Laravelはかなり前からMVCは強調してない。
デフォルトではルーティングからいきなりビューを返してるわけだからMもCもない。

Route::get('/', function () {
    return view('welcome');
});

https://github.com/laravel/laravel/blob/3f0e742421d8a922ba8a3b075189aa1bfd103ab6/routes/web.php

このままルーティングに処理を書けばM/Cなしでも動くものは作れる。
でもそれじゃ分かりにくいので一般的なMVCでも作れるようになってるだけ。

ConsoleとHttp

Laravelのディレクトリ構成で印象的なのは app/ の下に ConsoleHttp が同列に存在している。
artisanコマンドからもブラウザからでも入り口が違うだけで同じ扱い。
ブラウザからの場合のみ使うものはHttp下に置く。だからControllersはここ。
両方から使うものはapp下。Modelはここ。今回のPoliciesもここに作られる。

MVCだけ考えるとCを入り口と考えがちだけど実際はConsoleかHttpかという分岐が最初にある。
CはHttpの場合の一部機能でしかない。

  • C : app/Http/Controllers
  • M : app/
  • V : resources/views

バラバラ。他のフレームワークどころかLaravelの旧バージョンでも app/ に controllers,models,views を同列に置いてる例は多い。
https://github.com/laravel/laravel/tree/3.0/application
https://github.com/laravel/laravel/tree/v4.2.11/app

MVCは同列ではないのでMVCに拘らなくていい、と5.0で構成変える時にたぶん意図的に変えてる。

「どこに書いたらいいか?」の回答としてはartisanコマンドでも使うかどうか考えればいいとなる。

モデル

ここは自分のやり方。
Model=DB=Eloquentの認識。
Eloquentだけでもfillableとかリレーション関連とかで細々と書くことがあるのでEloquent内には余計なメソッドは増やさない。
isAdmin() とか簡単なものならいいけど。
Presenter的なものはtraitで分離。
Laravel用のPresenterパッケージとかあるけどそのせいでちょっとおかしなことになったのでもう使わない。

Eloquentに増やさないならアプリに必要な処理をどこに書くかというとリポジトリパターン。
複雑なことはしたくないけどリポジトリパターンはLaravel4時代から使われてるのでなんとか。
テストしやすくとかの理由は置いておいてモデル関連の処理をまとめるために使う。

コントローラー

モデルが上のようだと残りは全部コントローラーに書くことになるけどLaravelが充実してるのはここ。

  • middleware
  • バリデーションはFormRequest
  • 今回の認可
  • ViewComposer

その他色々な機能でコントローラーの外に持っていける。

極端な例だとコントローラーが

public function __invoke()
{
    return view('welcome');
}

だけでもこのページで色々表示はできる。

まずartisanコマンドで処理をして最終的なデータのみキャッシュ。一定時間ごとに繰り返す。

ViewComposerでキャッシュから読んだデータをviewに渡す。

元が1分かかる処理だろうと表示時はキャッシュからなので常に早い。ちょっと重いかもって時は割りとこの手を使う。

終わり

一旦手元で書けばこのくらいは書けそうだけど続けられるかどうかは分からない。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away