我正在尝试在Laravel 5.8中编写一个社交媒体网站,例如facebook。
我在/home
和/profile
中有相同的朋友列表,但有两个不同的控制器(HomeController和ProfileController)。我不想为两个不同的控制器复制粘贴相同的代码。我该如何解决,所以我只需要使用我的代码一次?
HomeController.php
public function index()
{
$friends = [];
$friendsID = Person_has_person::select('person2')->where('person1', Auth::user()->id)->get();
foreach ($friendsID as $friendID)
$friends[] = User::find($friendID->person2);
return view('home')->with('friends', $friends);
}
ProfileController.php
public function index()
{
$friends = [];
$friendsID = Person_has_person::select('person2')->where('person1', Auth::user()->id)->get();
foreach ($friendsID as $friendID)
$friends[] = User::find($friendID->person2);
return view('profile')->with('friends', $friends);
}
在我的web.php文件中,我有我的路线。
Route::get('/home', 'HomeController@index');
Route::get('/profile', 'ProfileController@index');
在我的模板中,我用它来显示我的朋友。
@if(count($friends) > 0)
@foreach($friends as $friend)
<ul>
<li>
<a href="/profile/{{$friend->id}}">{{$friend->firstname . ' ' . $friend->lastname}}</a>
<a class="text-danger"
href="/removeFriend/{{Auth::user()->id . '/' . $friend->id}}">[unfriend]</a>
</li>
</ul>
@endforeach
@else
<p>No friends available</p>
@endif
如您所见,我在两个不同的Controller中具有相同的代码。那不是一个好的解决方案。你能给我一个建议,我怎么编码,所以我只有一次?
答案 0 :(得分:1)
我不知道为什么管理员在这里删除了我的答案。但是这里又是。 View Composer非常适合这种情况。您可以使用boot
的{{1}}方法注册作曲家,也可以创建自己的服务提供商并将其注册在AppServiceProvider
config/app.php
数组中。
providers
和compose方法共享相同的代码:
View::composer(
['home', 'profile'],
'App\Http\View\Composers\YourViewComposer'
);
答案 1 :(得分:0)
尝试从其他index
调用controller
方法:
use ProfileController;
class HomeController {
public function index()
{
ProfileController::index();
}
}
答案 2 :(得分:0)
为什么不能使两个不同的Routes
指向同一Controller动作?
就像
Route::get('/home', 'ProfileController@index');
Route::get('/profile', 'ProfileController@index');
这是什么问题?
答案 3 :(得分:0)
我认为您可以创建一个存储库来查询数据库,并且可以从任何控制器或类中使用它。例如:
FriendRepository
<?php
namespace App\Repositories;
class FriendRepository
{
public function getAll($user_id)
{
$friends = [];
$friendsID = Person_has_person::select('person2')
->where('person1', $user_id)
->get();
foreach ($friendsID as $friendID) {
$friends[] = User::find($friendID->person2);
}
return friends;
}
}
然后在控制器中:
HomeController.php
<?php
namespace App\Http\Controllers;
use App\Repositories\FriendRepository;
use Illuminate\Http\Request;
class HomeController extends Controller
{
/**
* @var FriendRepository
*/
private $friend_repository;
public function __construct(FriendRepository $friend_repository)
{
$this->friend_repository = $friend_repository;
}
public function index()
{
$friends = $this->friend_repository->getAll(Auth::user()->id);
return view('home')->with('friends', $friends);
}
}
ProfileController.php
<?php
namespace App\Http\Controllers;
use App\Repositories\FriendRepository;
use Illuminate\Http\Request;
class ProfileController extends Controller
{
/**
* @var FriendRepository
*/
private $friend_repository;
public function __construct(FriendRepository $friend_repository)
{
$this->friend_repository = $friend_repository;
}
public function index()
{
$friends = $this->friend_repository->getAll(Auth::user()->id);
return view('home')->with('friends', $friends);
}
}
Here,您可以按照相同的模式看到另一个答案,这样您就可以理解。我认为这是一种有趣的方法,因为您可以使用来自控制器,命令,其他存储库或任何所需类的存储库。