Php 视图的Laravel依赖注入
我正试图掌握依赖注射的诀窍和拉雷维尔的IoC容器 目前,我有一个在视图中使用的静态方法类。例如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 */
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);
}
}
}