我正试图在Laravel中获得依赖注入和IoC容器的挂起。
目前我有一个充满静态方法的类,我在视图中使用它。 E.g。
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-&gt; boolicon($ v)}}`这样的方法。
我如何构建这个?大概我需要通过构造函数将Templatizer
的实例注入我的控制器? e.g。
class PagesController extends BaseController {
protected $templatizer;
public function __construct(Templatizer $templatizer)
{
$this->templatizer = $templatizer;
}
}
然后,对于索引页面的方法我将实例传递给视图? e.g。
# inside PagesController
public function index()
{
return View::make('pages.index', ['templatizer' => $this->templatizer]);
}
如果这是正确的,那么放置Templatizer
课程的适当位置在哪里?我如何将其绑定到IoC容器?
答案 0 :(得分:1)
首先,我没有看到静态调用这些方法有什么问题。看起来这只是一个你自己的HTML助手类,你应该没问题。
如果您决定使用依赖注入,那么注册课程的“正确”方式将使用Service Providers。
按照你编写的方式将它分配给视图会起作用,但是你也可以用这种方式获得它:
$templatizer = App::make('Yournamespace\Templatizer');
最后,您的案例中最好的解决方案可能就是建立自己的Facade。
答案 1 :(得分:1)
是的,你应该通过控制器构造函数注入它,只要它们被自动加载,文件就可以存在你喜欢的任何地方。
我喜欢在名为src
的根目录中创建一个文件夹,以便我的composer.json文件如下所示:
"autoload": {
"classmap": [
....
],
"psr-4": {
"Foo\\": "src/"
}
}
然后你可以使用src / Templatizer.php,它看起来像:
<?php namespace Foo;
class Templatizer {
}
现在你只需要一个服务提供者来绑定你的Templatizer实例(这基本上让Laravel知道你的类并允许你将它注入你的控制器)src / FooServiceProvider.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) {
答案 2 :(得分:0)
您还可以在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-&gt; boolicon($ v)}}`。