我正在尝试掌握 Aravel 中的依赖注入和 IoC 容器的窍门。
目前,我有一个充满静态方法的类,我在我的视图中使用的方法。 例如
class Templatizer {
/**
* Generates a colored FontAwsome check or cross from a true/false argument
* @param boolean $bool
* @return string The HTML markup of the icon
*/
public static function boolicon($bool)
{
return $bool ? '<span class="fa fa-check text-success"></span>' : '<span class="fa fa-times text-danger"></span>';
}
}
我让作曲家自动加载类,在我看来我可以{{ Templatizer::boolicon($trueOrFalseValue) }}
.
显然,这是不好的做法,我想放弃使用静态方法。我认为正确的方法是注入一个Templatizer
实例并使用类似{{ $templatizer->boolicon($v( }}'的方法。
我将如何构建它?大概我需要通过构造函数将Templatizer
实例注入我的控制器?例如
class PagesController extends BaseController {
protected $templatizer;
public function __construct(Templatizer $templatizer)
{
$this->templatizer = $templatizer;
}
}
然后,例如,对于索引页的方法,我将实例传递给视图?例如
# inside PagesController
public function index()
{
return View::make('pages.index', ['templatizer' => $this->templatizer]);
}
如果这是正确的,那么在哪里适合放置我的Templatizer
课?如何将其绑定到 IoC 容器?
首先,我认为静态调用这些方法没有任何问题。看起来这只是您自己的 HTML 帮助程序类,您应该没问题。
如果您决定使用依赖注入,注册类的"正确"方法是使用服务提供商。
以您编写的方式将其分配给视图将起作用,但您也可以在需要时通过以下方式获取它:
$templatizer = App::make('Yournamespace'Templatizer');
最后,在您的情况下,最好的解决方案可能是构建自己的立面。
是的,您应该通过控制器构造函数注入它,只要自动加载文件,这些文件就可以存在于您喜欢的任何地方。
我喜欢在根目录中创建一个名为src
的文件夹,以便我的composer.json文件如下所示:
"autoload": {
"classmap": [
....
],
"psr-4": {
"Foo''": "src/"
}
}
然后你可以有src/Templatizer.php它看起来像:
<?php namespace Foo;
class Templatizer {
}
现在你只需要一个服务提供者在src/FooServiceProvider中绑定你的Templatelatizer实例(这基本上使Laravel知道你的类并允许你将其注入你的控制器.php
<?php namespace Foo;
use Illuminate'Support'ServiceProvider;
class FooServiceProvider extends ServiceProvider {
/**
* Indicates if loading of the provider is deferred
*
* @var boolean
*/
protected $defer = false;
/**
* Register the service provider
*/
public function register() {
$this->app->bind('Foo'Templatizer', function($app) {
return new Templatizer();
});
}
}
不要忘记在应用程序配置中将Foo'FooServiceProvider
添加到providers
数组中,您应该已经准备好了......
public function __construct(Foo'Templatizer $templatizer) {
您也在 BaseController 上创建实例。
class BaseController extends Controller {
/**
* Setup the layout used by the controller.
*
* @return void
*/
var $templatizer;
protected function setupLayout()
{
if ( ! is_null($this->layout))
{
$this->layout = View::make($this->layout);
$templatizer = new 'Templatizer();
View::share('templatizer', $templatizer);
}
}
}
在"全部"视图中使用此$templatizer
实例。类似于{{ $templatizer->boolicon($v( }}'。