documentation on extending blade in Laravel 5似乎没有太多深度,我正努力去理解,如果我想要做什么是可能的。在Laravel中扩展刀片 - 创建自定义表单对象
注:我使用Laravel 5.1
这是Laravel文档给予延长叶片的唯一例子。
Blade::directive('datetime', function($expression) {
return "<?php echo with{$expression}->format('m/d/Y H:i'); ?>";
});
现在我想做的是有一个刀片文件看起来像这样:
@form('horizontal')
{{ $form->text('email') }}
{{ $form->text('password') }}
{{ $form->submit }}
@endform
然后我想,每当我用@form,可将其要创建一个新的$表单对象使用后,我用@form但它并不需要是@endform
后可用一点谷歌搜索后,只是瞎搞,我发现我可以做这样的事情:
\Blade::directive('form', function($expression) {
return '<?php $form = new App\Form'.$expression.'; ?>
<?php echo $form->open(); ?>';
});
(这是从以前的编辑更新)
这是大多数的方式。我有一个$ form对象,并可以创建一个新的窗体,我可以发送一个自定义参数给该窗体对象。我也可以在@form之后使用$ form对象。当然,从整个观点来看,这并不完美,但不一定是问题。
但是,由于我似乎在做一些完全没有记录的事情,所以我担心我可能做错了事,或者我可能会在稍后遇到问题。
我还应该注意到,我在网上找到的每一个指南都指向$ compiler-> createMatcher和$ compiler-> createPlainMatcher,但这两个似乎都在Laravel 5.1中被删除。
任何人都可以提供有关刀片扩展如何工作的任何见解,并提出更好的方法来做到这一点?现在它似乎正常工作,但感觉非常'哈克',并且可能不安全依靠前进。
更新HTML宏
要更新一个用例此基础上下方暗示HTML宏答案。 CSS框架引导包括垂直和水平表单的不同格式。这个功能的目的是要使它容易在这两者之间进行切换,一个例子如下:那么
@form('horizontal')
{{ $form->text("email", $user->email, 'Email') }}
@endform
Form类可能是这个样子:
class Form
{
public $direction;
public function __construct($direction)
{
$this->direction = $direction;
}
public function text($name, $value, $label)
{
return $this->wrap('<input type="text" value="'.$value.'" />', $name, $label);
}
public function wrap($element, $name, $label)
{
if($this->direction == 'horizontal') {
//Horizontal
return '<div class="form-group">
<label class="col-sm-2 control-label" for="'.$name.'">'.$label.'</label>
<div class="col-sm-10">
'.$element.'
</div>
</div>';
} else {
//Vertical
return '<div class="form-group">
<label for="'.$name.'">'.$label.'</label>
'.$element.'
</div>';
}
}
}
至于我知道HTML宏无法实现这种事情。
这是所有的伪示例代码,所以对任何错误表示歉意。我相信它的基本前提应该是清楚的。
您可以扩展FormBuilder类并相当容易地实现此功能,而无需接触Blade。看一下'Form :: model()'以及它如何保存模型的状态。您可以创建自己的开放方法,或者使用其他参数扩展现有的方法,并在稍后使用单个方法时使用它。 –
@Cryode我还没有听说过Form :: model()方法,因此将研究如何工作。 – robjbrain