如何为两个不同的控制器使用一个索引功能?

时间:2019-06-10 10:18:31

标签: php laravel controller

我正在尝试在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中具有相同的代码。那不是一个好的解决方案。你能给我一个建议,我怎么编码,所以我只有一次?

4 个答案:

答案 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,您可以按照相同的模式看到另一个答案,这样您就可以理解。我认为这是一种有趣的方法,因为您可以使用来自控制器,命令,其他存储库或任何所需类的存储库。