【发布时间】:2015-08-25 22:35:21
【问题描述】:
documentation on extending blade in Laravel 5 似乎没有太多深度,我很难理解我想做的事情是否可行。
注意:我使用的是 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 对象,并在我使用@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 中都被删除了。
谁能提供有关刀片扩展如何工作的任何见解并提出更好的方法?现在它似乎可以正常工作,但感觉非常“hacky”,并且可能不安全地依靠前进。
更新 HTML 宏
根据以下建议 HTML 宏的答案更新此用例。 CSS Framework Bootstrap 包括垂直和水平表单的不同格式。此功能的目的是方便在这两者之间进行切换,示例如下:
@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() 方法,所以将研究它是如何工作的。