簡體   English   中英

使用 Laravel 控制器作為組件構建視圖

[英]Using laravel controllers as components to build a view

我的 Laravel 5.4 應用程序中有各種組件,每個頁面都是使用這些組件構建的。 每個組件都有自己的邏輯,進行 API 調用(將被緩存)等。

每個組件控制器在完成其邏輯后返回一個視圖。

這是一個示例控制器:

class ExampleController
{
    public function index()
    {
        $projects = Api::create()->get('project/1234')
        return View::make('Pages::components.projectList')
            ->with('projects', self::$projects);
    }
}

我想要做的是為每個頁面創建一個“主”控制器,將各種組件組合在一起。

就像是:

return ExampleController@index . OtherController@index

稍后,我希望用戶能夠使用這些組件構建自己的頁面,因此構建靜態視圖將不起作用。 組件控制器將始終返回一個視圖。

這在 Laravel 中是如何完成的? 我是不是把問題都想錯了?

您可以使用視圖作曲家

將高highlights傳遞給每個視圖的示例:

<?php

class HighLightsComposer
{

    protected $users;

    public function __construct(BlogRepository $blog)
    {
        $this->blog = $blog
    }

    public function compose(View $view)
    {
        $view->with('highlights', $this->blog->highlights());
    }
}

class ComposerServiceProvider extends ServiceProvider
{
    public function boot()
    {
        View::composer(
            'highlights', 'App\Http\ViewComposers\HighlighsComposer'
        );
    }
}

class HomeController extends Controller {

    protected $blog;

    public function __construct(BlogRepository $blog)
    {
        $this->blog = $blog
    }

    public function index()
    {
        return view('blog', [
            'posts' => $blog->latest()
        ]);
    }
}

class ContactPageController extends Controller {

    public function index()
    {
        return view('contact');
    }

}

參考: https : //laravel-news.com/introducing-view-components-on-laravel-an-alternative-to-view-composers

我將使用 Laravel 5.3 來參考這個架構。 您需要將數據分發到以下內容中:

  1. 查看 ( https://laravel.com/docs/5.3/views )
  2. 模型 ( https://laravel.com/docs/5.3/eloquent )
  3. 控制器( https://laravel.com/docs/5.3/controllers
  4. 刀片模板 ( https://laravel.com/docs/5.3/blade )

您正在做的是附加視圖本身。 使用此邏輯,您將無法確定視圖中的 HTML 是否正在中斷,除非它被呈現。 相反,對視圖使用刀片模板。 請參閱 Blade 模板中的“擴展布局”以了解如何加入視圖。 其次,現在要獲取和傳遞數據,通過控制器使用模型。

因此,例如,讓我們考慮這個 StackOverflow 的第一頁。 此頁面將包含頁眉(將使用圖片、名稱等)、正文和頁腳。 在正文中,有更多的配置文件數據。 因此,您要做的是創建一個刀片模板,該模板將保存為 homepage.blade.php,存儲在“resources/views/layouts/homepage.blade.php”中。

@extend ('header_profile')
<body>
   <p>
        @yield('message)
   </p>
   <footer>
        End Page
   </footer>
 </body>

現在,創建一個控制器 homepage.php

<?php namespace App\Http\Controllers;

class CommunityController extends Controller {

    public function renderHomePage($user_id) {
        $userData = UserData::where('user_id', $user_id);
        $detailedUserData = DetailedUserInformation::where('user_id', $userData -> foreign_key_joiner);
        return view('homepage', ["main_info" => $userData, "personal_info" => $detailedUserData]);
    }

}

其中“UserData”和“DetailedUserInformation”是負責從數據庫獲取數據的雄辯模型。

現在,你得到的是:

  1. 創建模型將幫助您在不同的控制器中一次又一次地使用它們。 因此,您將省卻一次又一次地編寫查詢。
  2. 接下來,使用刀片模板將幫助您創建不會中斷的 HTML。 在一次又一次地附加到控制器的情況下,一個標簽可能會破壞一切。 因此,可以使用一次測試並使用多次。

使用這種架構。 從長遠來看,這將具有更好的可持續性,並且一次又一次地使用這些類來減少代碼。

在對 Laravel 文檔進行了一些挖掘之后,這似乎是一種干凈的方法:

class HomeController extends Controller
{
    public function index()
    {
        $projectList = (new ProjectListController())->index();
        $searchBox = (new SearchBoxController())->index();

        return view("App::index")
            ->with('projectList', $projectList)
            ->with('searchBox', $searchBox);
    }
}

index 方法是返回視圖的控制器的主要方法。

為此,每個組件控制器只需要返回一個 HTML 視圖,但這在我的應用程序中運行良好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM