axn / laravelcollective-form-to-raw-html
提供Artisan命令,用于将LaravelCollective Form::语法替换为原始HTML
Requires
- php: ^8.2
- laravel/framework: ^10.0 || ^11.0
Requires (Dev)
- laravel/pint: ^1.16.1
README
提供Artisan命令,用于将LaravelCollective Form::
语法替换为原始HTML
它会搜索{!! Form::<method>(<arguments>) !!}
或{{ Form::<method>(<arguments>) }}
,然后分析参数以确定HTML标签属性。
安装
使用Composer,作为开发依赖项
composer require axn/laravelcollective-form-to-raw-html --dev
用法
只需运行此命令
php artisan laravelcollective-form-to-raw-html:run
默认情况下,命令会扫描resources/views/
中的所有文件。
您还可以指定其他目录
php artisan laravelcollective-form-to-raw-html:run resources/views/admin/users
或单个文件
php artisan laravelcollective-form-to-raw-html:run resources/views/admin/users/create.blade.php
注意:目标路径始终相对于项目根目录。
支持的方法包括
- open(options)
- close()
- label(name, value, options, escape)
- labelRequired(name, value, options, escape)
- input(type, name, value, options)
- text(name, value, options)
- number(name, value, options)
- date(name, value, options)
- time(name, value, options)
- datetime(name, value, options)
- week(name, value, options)
- month(name, value, options)
- range(name, value, options)
- search(name, value, options)
- email(name, value, options)
- tel(name, value, options)
- url(name, value, options)
- color(name, value, options)
- hidden(name, value, options)
- checkbox(name, value, checked, options)
- radio(name, value, checked, options)
- file(name, options)
- password(name, options)
- textarea(name, value, options)
- select(name, list, selected, options)
- button(name, options)
- submit(name, options)
如果方法不受支持,则不会进行替换。
警告和限制
转义echo,不进行双重编码
LaravelCollective通常在内部使用转义echo,不进行双重编码
e($value, false)
这防止了编码的HTML实体再次被编码(&
=> &amp;
)
因此,您将看到在替换中使用此功能以保持原始行为。
例如
<label> {!! e('<strong>Name & firstname</strong>', false) !!} <label>
HTML结果将是
<strong>Name & firstname</strong>
转义并双重编码
如果您不想使用此功能,可以将--escape-with-double-encode
选项传递给命令。
因此,而不是这样转义
{!! e($value, false) !!}
值将这样转义
{{ $value }}
自动检索字段值
LaravelCollective有一个复杂的方法来自动检索字段的值:它在"old"值和请求中搜索。您可以在FormBuilder
类的getValueAttribute
方法中看到它。
由于实现起来过于复杂,因此转换器仅处理从"old"值检索的值。
例如
{!! Form::text('name') !!}
将被替换为
<input type="text" name="name" id="name" value="{!! e(old('name'), false) !!}" >
如果您有名称为数组的字段,转换器将像LaravelCollective一样将数组语法替换为点语法,用于old
辅助函数。
例如
{!! Form::text('name[0]') !!}
将被替换为
<input type="text" name="name[0]" value="{!! e(old('name.0'), false) !!}" >
如果您已经在Form::
语法中使用了old
辅助函数,转换器将检测它并不会重复使用"old"辅助函数。
警告1:如果名称的一部分在变量中(例如Form::text('name['.$index.']')
),转换器将像这样将替换函数集成到输出结果中
<input type="text" name="name[0]" value="{!! e(old(str_replace(['.', '[]', '[', ']'], ['_', '', '.', ''], 'name['.$index.']')), false) !!}" >
警告 2:如果你有名称为数组但没有显式键的字段(例如 name[]
),转换器无法确定使用哪个索引来获取正确的值,将简单地渲染 old('name')
而不是 old('name.<index>')
。你可能需要检查这些情况,手动设置获取值的方式(例如:old('name.0')
)。
自动确定单选按钮和复选框的选中状态
与获取值类似,转换器仅处理从“旧”值中获取的选中状态。如果“旧”值是多个,则使用 in_array
。
例如
{!! Form::checkbox('name[]') !!}
将被替换为
<input type="checkbox" name="name[]" value="1" @checked (in_array('1', (array) old('name'))) >
如果指定了默认选中状态,例如
{!! Form::checkbox('name[]', '1', true) !!}
它将显示为这样
<input type="checkbox" name="name[]" value="1" @checked (! old() ? true : in_array('1', (array) old('name'))) >
使用 optgroup 选择
Form::select
方法接受选项的分组数组以渲染 <optgroup>
。
这个功能太复杂,无法实现:这需要在 HTML 替换中添加大量代码,而这些代码 99% 的时间都是不必要的(除非你大量使用 optgroups)。转换器无法检测 list
参数是否包含组,因此无法检测使用 optgroups 的情况。你可能需要手动审查这些情况。
然而,转换器可以检测 Form::builder
的 optionsAttributes
或 optgroupsAttributes
参数是否已使用。如果是这样,相应的 Form::select
不会替换。
注释
如果原始语法中有注释,转换器将删除这些注释,但原始语法将以注释形式保留以供手动检查。你可以通过搜索 @TODO CHECK COMMENTS
来检索这些情况。
例如
{!! Form::text('name', null, [ 'class' => 'form-control', // 'required', ]) !!}
将被替换为
{{-- @TODO CHECK COMMENTS: {!! Form::text('name', null, [ 'class' => 'form-control', // 'required', ]) !!} --}} <input type="text" name="name" id="name" value="{!! e(old('name'), false) !!}" >
选项不是常规数组语法
如果选项参数不是常规数组,转换器将处理替换 Form::
语法,但将选项保留在注释中以供手动检查和手动替换 HTML 标签属性。你可以通过搜索 @TODO CHECK OPTIONS
来检索这些情况。
例如
{!! Form::text('name', null, array_merge($defaultOptions, [ 'size' => 50, 'required', ]) ) !!}
将被替换为
<input type="text" name="name" id="name" value="{!! e(old('name'), false) !!}" {{-- @TODO CHECK OPTIONS: array_merge($defaultOptions, [ 'size' => 50, 'required', ]) --}} >
日期字段
LaravelCollective 的 date
、time
、datetime
、week
和 month
方法支持使用 DateTime
实例作为值并内部格式化这些值。转换器无法检测值类型,因此如果你使用这些方法的值参数为 DateTime
实例,你可能需要审查这些情况。