仅在调用函数时加载类

时间:2015-09-15 07:36:59

标签: laravel dependency-injection

我有一个FrontendController从前端获取所有请求。由于所有网址都是:

Route::get('/{slug}', 'FrontendController@index');

我需要使用相同的控制器来获取所有实体。我的FrontendController看起来像这样:

use Auth;
use App;
use Cache;
use URL;
use Redirect; 
use Session; 
use Response; 

use App\Country;
use App\I18n;
use App\User;
use App\CMS;
use App\CMSPageContent;
use App\Slugs;
use App\News;
...
...
use App\Http\Controllers\Controller;

我有几个问题:

  • 是否在FrontendController的每次执行中都注入了所有这些服务。因为我可能正在加载整个代码,这会使我的页面加载速度变慢。
  • 如果回答上一个问题是肯定的,我是否可以仅在调用一个函数时加载库?
  • 这是解决slu the问题的好方法吗?因为所有网址只有一个部分仅出于搜索引擎优化的原因,我不知道其他方式来处理路线。

1 个答案:

答案 0 :(得分:1)

根据您使用代码的方式而有所不同。例如,如果您需要Auth登录方法,但没有其他方法,初始化模型或将模型注入该函数将浪费资源。

例如说这是我模型中的一个函数

public function doSomething()
{
//Do stuff
}

我想在我的Controller中调用此函数。我有几个选项,我可以在我的控制器顶部引用模型

use App\MyModel;

我认为这实际上并没有启动模型,它就像一个引用,因此当它被调用时,系统知道在哪里找到它。

我可以将它注入我的函数

public function myControllerFunction(\App\MyModel $model)
{
    return $model->doSomething();
}

由于模型被分配给$ model变量,因此使用的资源最多,如果您需要对数据库操作及其功能雄辩的模型,那么这很好。如果您只需要该模型中的一个函数,那么静态调用将使用更少的资源。

在你的模型中使函数静态

public static function doSomething()
{

}

然后在您的控制器中,您可以像这样调用它

public function myControllerFunction()
{
    return \App\MyModel::doSomething();
}

这将使用更少的资源并稍微清理代码,因为您不需要在控制器顶部继续引用您的用途