可由多个控制器和命令使用的Laravel方法。应该在哪里?

时间:2017-10-26 13:16:02

标签: php laravel laravel-5 eloquent laravel-5.4

我想定义一个可以被多个控制器和命令使用的“全局”方法。它应该放在Laravel 5.4中哪里?

假设我有以下控制器。我将如何调用“全局”方法,以及“全局”方法的确切位置?

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;

use App\Flight;

class FlightsController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Index
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $flights = Flight::where('active', 1)
               ->orderBy('name', 'desc')
               ->take(10)
               ->get();

        foreach ($flights as $flight) {
            if ( $flight->price == 0 )
            {
                $output = "some value";
            }
            else
            {
                $output = "some other value";
            }
        }

        return view('flights.index')
                ->with(['output'   => $output])
                ;
    }
}

4 个答案:

答案 0 :(得分:4)

当你想要一个获取许多模型的方法,并且你想在很多地方使用它时,把它放在一个存储库中:

class FlightRepository
{
    public function getLastTenFlights()
    {
        return Flight::where('active', 1)
           ->orderBy('name', 'desc')
           ->take(10)
           ->get();
    }
}

例如来自您的控制器:

public function index( FlightRepository $repo )
{
    $flights = $repo->getLastTenFlights();

    //if you want you can put this additional login in the method too... 
    foreach ($flights as $flight) {
        if ( $flight->price == 0 )
        {
            $output = "some value";
        }
        else
        {
            $output = "some other value";
        }
    }

    return view('flights.index')
            ->with(['output'   => $output])
            ;
}

答案 1 :(得分:0)

您可以创建一个Object并在需要时调用该对象。

参见示例:

FlighRepository = new FlighRepository;

FlighRepository->index();

答案 2 :(得分:0)

我个人更喜欢查询范围到存储库,所以我会这样做:

> xy.coords(chances1617$location_x, chances1617$location_y)
$y
[1]   1 122 189 142 139  90 157  73 176 139  73 142 119  77 211 109  35 112
[19]  33   3 211 150  73  85   6 140 189 196 140 202 168 122 147  22 150 150 
...
$x
[1]   1 235  73  16 218 211  41  27  39 184 211 169 233 135 333  29 158 343
[19] 346  23  31 204 192  33 297 227 126  58 202   4  78 235  26 330 199 192

你可以像使用它一样使用它,只是它更具可读性:

class Flight extends Model
{

    // model setup

    /**
     * Scope query to get last 10 flights.
     *
     * @param \Illuminate\Database\Eloquent\Builder $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeLastTen($query)
    {
        return $query->where('active', 1)->orderBy('name', 'desc')->take(10);
    }

    // rest of model
}

这还具有能够链接其他查询的优点。比如说,你想要最后十次美国航空公司航班,你可以这样做:

$flights = Flight::lastTen()->get();

答案 3 :(得分:0)

我认为该服务是存储控制器和命令之间共享功能的最佳选择。您可以使用服务容器(https://laravel.com/docs/5.5/container)访问它们。