Laravel 5.4 Collective
Laravel 5.4 Collective
Laravel 5.4 Collective
About
Laravel
GitHub
Twitter
Docs
About
Laravel
GitHub
Twitter
5.4
5.3
5.2
5.1
5.0
Installation
Begin by installing this package through Composer. Edit your project's composer.json file to require
laravelcollective/html.
'providers' => [
// ...
Collective\Html\HtmlServiceProvider::class,
// ...
],
'aliases' => [
// ...
'Form' => Collective\Html\FormFacade::class,
'Html' => Collective\Html\HtmlFacade::class,
// ...
],
Looking to install this package in Lumen? First of all, making this package compatible with Lumen will
require some core changes to Lumen, which we believe would dampen the effectiveness of having
Lumen in the first place. Secondly, it is our belief that if you need this package in your application, then
you should be using Laravel anyway.
Opening A Form
Opening A Form
By default, a POST method will be assumed; however, you are free to specify another method:
echo Form::open(['url' => 'foo/bar', 'method' => 'put'])
Note: Since HTML forms only support POST and GET, PUT and DELETE methods will be spoofed by
automatically adding a _method hidden field to your form.
You may also open forms that point to named routes or controller actions:
echo Form::open(['route' => 'route.name'])
If your form is going to accept file uploads, add a files option to your array:
echo Form::open(['url' => 'foo/bar', 'files' => true])
CSRF Protection
Adding The CSRF Token To A Form
Laravel provides an easy method of protecting your application from cross-site request forgeries. First, a random
token is placed in your user's session. If you use the Form::open method with POST, PUT or DELETE the CSRF token will
be added to your forms as a hidden field automatically. Alternatively, if you wish to generate the HTML for the
hidden CSRF field, you may use the token method:
echo Form::token();
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:
Note: When using Form::model, be sure to close your form with Form::close!
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;
/**
* 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
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.
echo Form::text('username');
Note: The hidden and textarea methods have the same signature as the text method.
Number
Generating A Number Input
Date
Generating A Date Input
File Input
Generating A File Input
echo Form::file('image');
Note: The form must have been opened with the files option set to true.
Drop-Down Lists
Generating A Drop-Down List
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...']);
echo Form::select('animal',[
'Cats' => ['leopard' => 'Leopard'],
'Dogs' => ['spaniel' => 'Spaniel'],
]);
Buttons
Generating A Submit Button
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">';
});
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 the Form facade.
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' => []]);
Using our example from above (specifically, the one with default values provided), you can call your Custom
Component like so:
{{ Form::bsText('first_name') }}
link_to_asset
link_to_route
link_to_action
Annotations
HTML & Forms
Remote (SSH)
Iron Queue
Command Bus