Php 视图的Laravel依赖注入

Php 视图的Laravel依赖注入,php,laravel-4,Php,Laravel 4,我正试图掌握依赖注射的诀窍和拉雷维尔的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 */

我正试图掌握依赖注射的诀窍和拉雷维尔的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>';
    }
}
然后,比如说,对于索引页的方法,我将实例传递给视图?e、 g

# inside PagesController
public function index()
{
    return View::make('pages.index', ['templatizer' => $this->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 {

}

您还可以在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);
        }
    }

}
在all视图中使用此
$templatizer
实例。
类似于{$templatizer->boolicon($v)}}`.

事实上,我认为您提出了一个很好的观点,即这些都是静态方法,可以按原样使用。例如,Laravel附带的
illigate\Str
类的工作方式相同。然而,我的问题仍然适用于其他情况。
<?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();
        });
    }
}
public function __construct(Foo\Templatizer $templatizer) {
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);
        }
    }

}