Laravel 可以被多个控制器和命令使用的方法。它应该在哪里?
Laravel method that can be used by multiple controllers and commands. Where should it be?
我想定义一个可以被多个控制器和命令使用的 "global" 方法。它应该放在Laravel 5.4的什么地方?
假设我有以下控制器。我将如何调用 "global" 方法,以及 "global" 方法的确切位置?
<?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])
;
}
}
当你想要一个获取很多模型的方法,并且你想在很多地方使用它时,把它放在一个存储库中:
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])
;
}
您可以创建一个对象并在需要时调用该对象。
参见示例:
FlighRepository = new FlighRepository;
FlighRepository->index();
我个人更喜欢查询范围而不是存储库,所以我会这样做:
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();
这还具有能够将其他查询链接到它之外的优势。举例来说,您想要美国航空公司的最后 10 个航班,您可以这样做:
$flights = Flight::lastTen()->where('airline', 'American')->get();
// equivalent to
// $flights = Flight::where('airline', 'American')->lastTen()->get();
我认为服务是存储控制器和命令之间共享的功能的最佳选择。您可以使用服务容器 (https://laravel.com/docs/5.5/container) 访问它们。
我想定义一个可以被多个控制器和命令使用的 "global" 方法。它应该放在Laravel 5.4的什么地方?
假设我有以下控制器。我将如何调用 "global" 方法,以及 "global" 方法的确切位置?
<?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])
;
}
}
当你想要一个获取很多模型的方法,并且你想在很多地方使用它时,把它放在一个存储库中:
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])
;
}
您可以创建一个对象并在需要时调用该对象。
参见示例:
FlighRepository = new FlighRepository;
FlighRepository->index();
我个人更喜欢查询范围而不是存储库,所以我会这样做:
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();
这还具有能够将其他查询链接到它之外的优势。举例来说,您想要美国航空公司的最后 10 个航班,您可以这样做:
$flights = Flight::lastTen()->where('airline', 'American')->get();
// equivalent to
// $flights = Flight::where('airline', 'American')->lastTen()->get();
我认为服务是存储控制器和命令之间共享的功能的最佳选择。您可以使用服务容器 (https://laravel.com/docs/5.5/container) 访问它们。