我想定义一个可以被多个控制器和命令使用的“全局”方法。它应该放在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])
;
}
}
答案 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)访问它们。