安裝
通過composer安裝擴展包. 在根目錄的composer.json
文件中添加laravelcollective/html
.
"require": {
"laravelcollective/html": "5.3.*"
}
接着在終端中更新composer:
1
|
composer update |
然後,在config/app.php文件中添加新的providers
:
1
2
3
4
5
|
'providers'
=> [ // ... Collective\Html\HtmlServiceProvider:: class , // ... ], |
最後,在config/app.php中添加別名數組
:
1
2
3
4
5
6
|
'aliases'
=> [ // ... 'Form'
=> Collective\Html\FormFacade:: class , 'Html'
=> Collective\Html\HtmlFacade:: class , // ... ], |
打開表單
打開表單
1
2
3
|
{!! Form::open([ 'url'
=> 'foo/bar' ]) !!} // {!! Form::close() !!} |
默認是post請求,你也可以使用其他請求:
1
|
echo
Form::open([ 'url'
=> 'foo/bar' ,
'method' => 'put' ]) |
注意: HTML表單只支持
POST
和GET
,PUT
和DELETE方法
會被自動添加一個假的_method
隱藏字段到你的表單中.
You may also open forms that point to named routes or controller actions:你也可以打開指向到路由和控制器的表單:
1
2
3
|
echo
Form::open([ 'route'
=> 'route.name' ]) echo
Form::open([ 'action'
=> 'Controller@method' ]) |
還可以指定路由參數:
1
2
3
|
echo
Form::open([ 'route'
=> [ 'route.name' ,
$user ->id]]) echo
Form::open([ 'action'
=> [ 'Controller@method' ,
$user ->id]]) |
如果表單支持文件上傳,添加files選項到數組中:
1
|
echo
Form::open([ 'url'
=> 'foo/bar' ,
'files' => true]) |
CSRF 保護
添加CSRF Token到表單
Laravel提供一種簡單的方式保護你的應用防止跨域請求僞造,首先,你的session中會被置放一個隨機的token,如果你使用 Form::open
方法,CSRF token會以隱藏字段的形式被自動添加到比表單中,或者,如果你想爲隱藏的CSRF字段生成HTML,你可以使用token方法:
1
|
echo
Form::token(); |
把CSRF過濾器指向路由
1
2
3
4
5
6
7
8
9
|
Route::post( 'profile' ,
[ 'before'
=> 'csrf' , function () { // } ] ); |
表單模型綁定
打開表單模型
Often, you will want to populate a form based on the contents of a model. To do so, use the Form::model
method:
echo Form::model($user, ['route' => ['user.update', $user->id]])
Now, when you generate a form element, like a text input, the model's value matching the field's name will automatically be set as the field value. So, for example, for a text input named email
, the user model's email
attribute
would be set as the value. However, there's more! If there is an item in the Session flash data matching the input name, that will take precedence over the model's value. So, the priority looks like this:
- Session Flash Data (Old Input)
- Explicitly Passed Value
- Model Attribute Data
This allows you to quickly build forms that not only bind to model values, but easily re-populate if there is a validation error on the server!
Note: When using
Form::model
, be sure to close your form withForm::close
!
Form Model Accessors
Laravel's Eloquent Accessor allow you to manipulate a model attribute before returning it. This can be extremely useful for defining global date formats, for example. However, the date format used for display might not match the date format used for form elements. You can solve this by creating two separate accessors: a standard accessor, and/or a form accessor.
To define a form accessor, create a formFooAttribute
method on your model where Foo
is the "camel" cased name of the column you wish to access. In this example, we'll define an accessor
for the date_of_birth
attribute. The accessor will automatically be called by the HTML Form Builder when attempting to pre-fill a form field when Form::model()
is
used.
<?php
namespace App;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* Get the user's first name.
*
* @param string $value
* @return string
*/
public function getDateOfBirthAttribute($value)
{
return Carbon::parse($value)->format('m/d/Y');
}
/**
* Get the user's first name for forms.
*
* @param string $value
* @return string
*/
public function formDateOfBirthAttribute($value)
{
return Carbon::parse($value)->format('Y-m-d');
}
}
Labels
Generating A Label Element
echo Form::label('email', 'E-Mail Address');
Specifying Extra HTML Attributes
echo Form::label('email', 'E-Mail Address', ['class' => 'awesome']);
Note: After creating a label, any form element you create with a name matching the label name will automatically receive an ID matching the label name as well.
Text, Text Area, Password & Hidden Fields
Generating A Text Input
echo Form::text('username');
Specifying A Default Value
echo Form::text('email', '[email protected]');
Note: The hidden and textarea methods have the same signature as the text method.
Generating A Password Input
echo Form::password('password', ['class' => 'awesome']);
Generating Other Inputs
echo Form::email($name, $value = null, $attributes = []);
echo Form::file($name, $attributes = []);
Checkboxes and Radio Buttons
Generating A Checkbox Or Radio Input
echo Form::checkbox('name', 'value');
echo Form::radio('name', 'value');
Generating A Checkbox Or Radio Input That Is Checked
echo Form::checkbox('name', 'value', true);
echo Form::radio('name', 'value', true);
Number
Generating A Number Input
echo Form::number('name', 'value');
Date
Generating A Date Input
echo Form::date('name', \Carbon\Carbon::now());
File Input
Generating A File Input
echo Form::file('image');
Note: The form must have been opened with the
files
option set totrue
.
Drop-Down Lists
Generating A Drop-Down List
echo Form::select('size', ['L' => 'Large', 'S' => 'Small']);
Generating A Drop-Down List With Selected Default
echo Form::select('size', ['L' => 'Large', 'S' => 'Small'], 'S');
Generating a Drop-Down List With an Empty Placeholder
This will create an <option>
element with no
value as the very first option of your drop-down.
echo Form::select('size', ['L' => 'Large', 'S' => 'Small'], null, ['placeholder' => 'Pick a size...']);
Generating A Grouped List
echo Form::select('animal',[
'Cats' => ['leopard' => 'Leopard'],
'Dogs' => ['spaniel' => 'Spaniel'],
]);
Generating A Drop-Down List With A Range
echo Form::selectRange('number', 10, 20);
Generating A List With Month Names
echo Form::selectMonth('month');
Buttons
Generating A Submit Button
echo Form::submit('Click Me!');
Note: Need to create a button element? Try the button method. It has the same signature as submit.
Custom Macros
Registering A Form Macro
It's easy to define your own custom Form class helpers called "macros". Here's how it works. First, simply register the macro with a given name and a Closure:
Form::macro('myField', function()
{
return '<input type="awesome">';
});
Now you can call your macro using its name:
Calling A Custom Form Macro
echo Form::myField();
Custom Components
Registering A Custom Component
Custom Components are similar to Custom Macros, however instead of using a closure to generate the resulting HTML, Components utilize Laravel Blade Templates. Components can be incredibly useful for developers who use Twitter Bootstrap, or any other front-end framework, which requires additional markup to properly render forms.
Let's build a Form Component for a simple Bootstrap text input. You might consider registering your Components inside a Service Provider's boot
method.
Form::component('bsText', 'components.form.text', ['name', 'value', 'attributes']);
Notice how we reference a view path of components.form.text
. Also, the array we provided is a sort of method signature for your Component. This
defines the names of the variables that will be passed to your view. Your view might look something like this:
// resources/views/components/form/text.blade.php
<div class="form-group">
{{ Form::label($name, null, ['class' => 'control-label']) }}
{{ Form::text($name, $value, array_merge(['class' => 'form-control'], $attributes)) }}
</div>
Custom Components can also be created on the
Html
facade in the same fashion as on theForm
facade.
Providing Default Values
When defining your Custom Component's method signature, you can provide default values simply by giving your array items values, like so:
Form::component('bsText', 'components.form.text', ['name', 'value' => null, 'attributes' => []]);
Calling A Custom Form Component
Using our example from above (specifically, the one with default values provided), you can call your Custom Component like so:
{{ Form::bsText('first_name') }}
This would result in something like the following HTML output:
<div class="form-group">
<label for="first_name">First Name</label>
<input type="text" name="first_name" value="" class="form-control">
</div>
Generating URLs
link_to
Generate a HTML link to the given URL.
echo link_to('foo/bar', $title = null, $attributes = [], $secure = null);
link_to_asset
Generate a HTML link to the given asset.
echo link_to_asset('foo/bar.zip', $title = null, $attributes = [], $secure = null);
link_to_route
Generate a HTML link to the given named route.
echo link_to_route('route.name', $title = null, $parameters = [], $attributes = []);
link_to_action
Generate a HTML link to the given controller action.
echo link_to_action('HomeController@getIndex', $title = null, $parameters = [], $attributes = []);
https://laravelcollective.com/docs/5.3/html