Php 拉威尔:如何组织BaseContoller
我将在我的Php 拉威尔:如何组织BaseContoller,php,laravel,controller,laravel-4,Php,Laravel,Controller,Laravel 4,我将在我的BaseController中有一个方法来检测用户来自的城市。 最好的方法是什么?我还想利用自动解析,并将某种定位服务传递给BaseController的构造函数 <?php use Andrew\Services\LocationService; class BaseController extends Controller { protected $locationService; public function __construct( LocationService
BaseController
中有一个方法来检测用户来自的城市。
最好的方法是什么?我还想利用自动解析,并将某种定位服务
传递给BaseController
的构造函数
<?php
use Andrew\Services\LocationService;
class BaseController extends Controller {
protected $locationService;
public function __construct( LocationService $locationService )
{
$this->locationService = $locationService;
$this->detectLocation();
}
/**
* Setup the layout used by the controller.
*
* @return void
*/
protected function setupLayout()
{
if ( ! is_null($this->layout))
{
$this->layout = View::make($this->layout);
}
}
public function detectLocation()
{
$this->locationService->detect();
}
这是实现我需要的适当方式吗?看起来不是要做很多工作吗?你确定要注射吗?似乎有一个
LocationService
facade(如在Laravel中)会更干净,它将通过App::make()
解决,即使它耦合了您的类。不管怎样,您需要在哪里获得$this->locationService->detect()
?@SergeyTelshevsky是的,facade也是一个选项。我需要每个控制器或布局视图中的$this->locationService->detect()
结果-一旦我检测到用户的位置,我就向他们显示他们所在的城市。你能解释为什么facade是更好的选择吗?好吧,这主要是一个偏好的问题,但我不认为必须在控制器中注入一些只在某些情况下使用的东西,即使它不是某些情况下,但许多方法(想想不需要它的post操作和json响应)是一个好方法。您只需在detectLocation
方法中实例化服务并在执行时进行检测即可。如果你需要展示更多类似的东西,只需考虑一种情况。构造器将填充不常使用的内容。您不能在App::before()筛选器或其他内容中添加“detect location”吗?然后在那里运行一次,而不是在控制器中运行?我不认为控制器是它的合适位置……如果您每次只需要将数据放入视图中,只需使用视图生成器,您最好将其放入LocationService
服务提供商。这可能是最干净的方法,需要最少的工作量。
// Sub-controller
public function __construct( CalculatorValidator $validator, TotalCostService $totalCost)
{
parent::__construct(new LocationService);
$this->validator = $validator;
$this->totalCost = $totalCost;
}