2017-09-07 9 views
-1

私はLaravel 5.3を使ってギターレッスンサイトを持っています。それにはレッスンがあり、練習に分かれています。Laravel 5.3のコードでは、公開/未公開ステータスに基づいてコンテンツアクセスを制御しますか?

私は本日、発表されたレッスンやエクササイズをマークする機能をバックエンドに追加することを決めました。私は単に、0または1を含むそれぞれの表に「公開された」列を追加しました。

レッスン・ビュー、エクササイズ・ビュー、レッスンなど、いくつかの形や形でエクササイズやレッスンが利用される場所がたくさんあります部分的なビュー(表形式のリスト)、部分的なビュー(表形式のリスト)、検索/クエリビュー。レッスンやエクササイズのヒット数を増やしたり、レッスンやエクササイズを自分のお気に入りに追加するなどの機能を実行するルートもあります。

上記のように、最小限のコード編集を使用して、未発表のレッスンやエクササイズへのアクセスを防止する方法はわかりません。私はコントローラのファイルを調べ始めましたが、コントローラがクエリの結果ページなどのすべてを捕まえていない可能性があることを認識しました。また、コントローラファイルには複数のメソッドが含まれているため、別々に編集する必要はありません。私は、複数のファイルで多数のクエリを修正する必要なく、私が全世界で必要としていることを行うための "ラーベル方法"があると私は思っています。 おそらくミドルウェアなのでしょうか?

いずれにしても、私はlaravelの新機能です。公開されていないとマークされているコンテンツのルートを制御しようとする試みが本当にありましたら、それについて知りたいと思います。

おかげ

答えて

0

は、さておき、私はモデルで公表された状態のようなもののためにタイムスタンプを使用することを好むように、この

+1

これは本当に滑らかです!それを試してうまく動作します。しかし、今私はバックエンドCRUDの未発表のアイテムを見ていません...だから、これをブートメソッドに追加しました:if(!$ user-> hasRole( 'admin'))そしてすべてがうまくいくようです。もっとテストする必要がありますが、私にこれを見せてくれてありがとう! – Brian

0

を行うlaravelest方法をglobal scopesを見てみましょう。これは、そのコンテンツが利用可能になる、つまり私が休暇を取っている場合、将来のタイムスタンプを設定できることを意味します。

あなたの実際の問題の観点から

、クエリ範囲が移動するための方法のようになります。あなたの代わりにタイムスタンプを使用しなかった場合、

class Lesson extends Model 
{ 
    public function scopePublished($query) 
    { 
     return $query->wherePublished(true); 
    } 
} 

また、あなたが行うことができます:

class Lesson extends Model 
{ 
    public function scopePublished($query) 
    { 
     return $query->where('published', '<=', $this->freshTimestamp()); 
    } 
} 

ますこのスコープを使用するようにフロントエンドコードを更新する必要があります:

public function LessonController extends Controller 
{ 
    public function index() 
    { 
     $lessons = Lesson::published()->latest()->paginate(); 

     return view('lesson.index', compact('lessons')); 
    } 
} 
+0

興味深い。 LessonControllerのpublished()で、scopePublished()を使用しますか?私の現在のレッスンコントローラでは、私はこの行を持っています:$ query = \ App \ Lesson :: query();あなたのアプローチでは、私はちょうどあなたが上記の方法にそれを変更するだろうか?レッスンコントローラには他の方法がありますか?私は、公開されたステータスに1つの小切手を適用し、関連するすべての方法で機能させる方法を見つけようとしています。 – Brian

+0

このメソッドはモデルで 'scopePublished()'として定義されていますが、クライアントコードで 'published()'を呼び出すだけで済みます.Laravelは自動的にスコープメソッドを意味すると判断します。カウンター直感的、私は知っている! –

+0

私はあなたの答えが本質的に@Quezlerが言及したスコープのアイデアとどのように関係しているかを見ています。私は今、グローバルスコープを使って、ユーザーが管理者であるかどうかをテストしています。毎日laravelについて新しいことを学びましょう!しかし、ギターを弾くことに戻る必要があります! – Brian

関連する問題