Laravel依赖注入视图


Laravel dependancy injection for views

我正在尝试掌握 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( }}'。