[英]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 來參考這個架構。 您需要將數據分發到以下內容中:
您正在做的是附加視圖本身。 使用此邏輯,您將無法確定視圖中的 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”是負責從數據庫獲取數據的雄辯模型。
現在,你得到的是:
使用這種架構。 從長遠來看,這將具有更好的可持續性,並且一次又一次地使用這些類來減少代碼。
在對 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.