2017-01-03 8 views
0

まず、私は をPHPフレームワークとMVCで初めて動作させていると言いたいと思いますが、まだ私の問題に対するすべての答えが見つかりませんでした。私は現在、Laravel 5.3を使用しています。PHP MVC理解ヘルプ(Laravel 5.3)

問題:私は、ユーザーがログインできるページといくつかのページ(私はLaravel Authを使用しています)を持っていて、毎回同じサイドバーがあるページがたくさんあります。それから、私はすべてのページに異なる内容(about、articles、...)を持っています。私は最も重要なことは、コードを2度書くべきではないということだと聞きましたが、問題があります。このサイドバーには、ユーザーにコンテンツを表示する "サービス"がありますが、認証されたユーザーからのユーザーデータを必要とするアルゴリズムがあり、Auth関数はLaravel 5.3のServiceProviderまたはBaseControllerでは使用できません。さあ。

私の質問はどうやってそれをきれいにすることができるのですか?

それをよりよく理解するためのいくつかのコードは:

ルート:

Route::get('/community/ranking', 'Pages\[email protected]'); 
Route::get('/community/advertising', 'Pages\[email protected]'); 
Route::get('/logout', '[email protected]'); 
Route::get('/home', 'Pages\[email protected]'); 

その後、私はすべてのページこのページのコンテンツ提供専用のコントローラ持って(サイドバーのを除いて - はまだありませんソリューションを) 。

にHomeController:

<?php 
namespace App\Http\Controllers\Pages; 

use App\Http\Controllers\BaseController; 
use Redis; 
use App\Http\Requests; 
use Request; 
use Shoutbox; 
use User; 

class HomeController extends BaseController 
{ 
function getView() 
{ 
    $shoutboxData = $this->getShoutboxData(); 

    return view('pages.home', compact('shoutboxData')); 
} 

private function getShoutboxData() 
{ 
    $shoutbox = Shoutbox::orderBy('time', 'DESC')->skip(0)->take(15)->get(); 

    if(count($shoutbox) > 0) 
    { 
     foreach($shoutbox as $entry) 
     { 
      $getUser = User::where('id', '=', $entry->user_id)->first(); 

      $entry['username'] = $getUser->username; 
      $entry['look'] = $getUser->look; 

      $shoutboxData[] = $entry; 
     } 
    } 
    else 
    { 
     $shoutboxData = null; 
    } 

    return $shoutboxData; 
} 

public function systemMessage() 
{ 
    $redis = Redis::connection(); 

    $redis->publish('chat.message', json_encode([ 
     'msg'  => 'System message', 
     'nickname' => 'System', 
     'system' => true, 
    ])); 
} 
} 

今、私はそれぞれのビューを提供し、独自のコントローラと(たとえば、一言ボックス用、ニュース)このページのコンテンツは、そのコントローラでもあります。 (私の意見ではそれほど清潔ではありませんでしたが、より良い方法は見つけられませんでした。

私はすべてのコントローラでサイドバーコンテンツを提供できますが、これは私が望むものではありません。どうやってやるの?私はMVCを使用していますか?

ありがとうございます!

答えて

1

Laravel Bladeテンプレートシステムを使用しているため、ビューロジックを別々のブレードファイルに分割できます。

あなたのサイドバーは、ので、あなたのレイアウトファイルでこれを置くすべてのページに共通しているが(リソース/ビュー/レイアウト/ app.blade.php)各個人のブレード・ファイルに今

<div class="container" id="app"> 
    @yield('content') 
</div> 

前にロジックを置きますレイアウトテンプレートを拡張するだけです。

ここで、layouts.appを拡張するすべてのブレードファイルに、サイドバーロジックが追加されます。


EDIT:追加の情報が提供....私は上記の言ったように行うだけでなく、ビューの作曲を作成し、あなたはここで完全なドキュメントを見つけることができます:https://laravel.com/docs/5.3/views#view-composers

メイン用のView Composerを作成します。レイアウト(またはレイアウトを拡張する場合はサイドバーレイアウト)を使用し、ビューコンポーザ内でデータを渡すと、ドキュメントには良い例が示されています。

+0

私はそれを知っていますが、データをビューにプッシュする必要があります。そして、私はそれをどのように行うことができるかを知りたいと思っています。 –