Laravel依赖注入视图

时间:2014-12-18 10:39:00

标签: php laravel-4

我正试图在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容器?

3 个答案:

答案 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)}}`。