Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 拉威尔:如何组织BaseContoller_Php_Laravel_Controller_Laravel 4 - Fatal编程技术网

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;
}