Forms in laravel - laravel

I'm new to laravel and I saw different types of declaration of forms in laravel.
So when to use regular(html) type :
<form></form>
When to use laravel type:
{{ Form::open()}}
and when this:
{!! Form::open()!!}

According to Laravel's blade documentation:
By default, Blade {{ }} statements are automatically sent through
PHP's htmlspecialchars function to prevent XSS attacks while {!! !!}
displays Unescaped characters.
Keep in mind, the Form syntax has been removed in Laravel 5, so to use it you will need to install a separated package by Laravel Collective.
As per laravel's collective documentation, the correct syntax would be using the unscaped characters:
{!! Form::open(['url' => 'foo/bar']) !!}
//
{!! Form::close() !!}

In Laravel 5 you should use:
{!! Form::open() !!}
Instead of:
{{ Form::open() }}
Laravel Collective Form will generate plain HTML form for you. It's just easier to build maintainable forms with Laravel Collective but if you don't want to use it for some reason, you can always build a form manually by using:
<form></form>

Related

Laravel 7.x Blade {!! !}} escaped question mark symbol (?) though it is not included in php htmlspecialchars

In blade.php file, i used {!! $imageLink !!}
$imageLink is "mysite.com/my_image.png?version=1586505972".
But when i inspected elements, it become "mysite.com/my_image.png%3Fversion%3D1586505972"
Although the symbol ? not included in https://www.php.net/manual/en/function.htmlspecialchars.php
I found the reason
$imageLink is actually encoded before passing to blade, it's from return Storage::url($image);

Laravel Collective Syntax

I'm learning laravel (5.5) from a book.
I installed laravel collective, the book says, to link a css file write like this:
{{!! HTML::style('css/app.css') !!}} It works fine.
but in the output two empty {} braces appear (because they are not being used as part of the syntax). So, I removed them and it still works fine.
Question is which syntax is correct?
this {{!! HTML::style('css/app.css') !!}}
or {!! HTML::style('css/app.css') !!}
???
Out of the box Laravel tries to help you with security within your apps. When outputting data using the {{ $foo }} data, Laravel automatically calls the htmlspecialchars() method to prevent XSS attacks. In some cases you do want or need to output HTML, that's why Laravel created a separated syntax for that: {!! $foo !!}.
So to answer your question: {!! $foo !!} is the correct syntax.
Off topic:
If you'd like to not use the unescaped data syntax, you could write you're CSS linking like this:
<link rel="stylesheet" href="{{ asset('css/app.css') }}">

In a Form Model Binding form, how do I access the variable without using a helper?

I am building a form using Form Model Binding via the Laravel Collective HTML package. The documentation (https://laravelcollective.com/docs/5.2/html#form-model-binding) boasts how the model's value is conveniently available with the value being set in the priority order of:
Session Flash Data (Old Input)
Explicitly Passed Value
Model Attribute Data
This is super useful because if a user has changed multiple fields, but 1 of them fails validation, you don't want all the other fields being reset to original value when they get thrown back to the form page with a helpful Message Bag of errors to give them a chance to correct their invalid input.
It's all very well using the Form::label, Form::text and Form::select helpers to leverage this lovely feature but what if you just want to access that convenient variable directly to do something a bit left-field?
Here's what I have tried...
{{ Form::model($user, array('route' => array('user.update', $user->id))) }}
{{ Form::label('first_name', 'First Name:', array('class' => 'address')) }}
{{ Form::text('first_name') }}
{{ Form::value('first_name') }} <-- No
{{ Form::session('first_name') }} <-- Nope
{{ Form::input('first_name') }} <-- Still no
{{ Form::attribute('first_name') }} <-- Absolutely not
{{ Form::close() }}
Help me, what is the method I am looking for?
The documentation hints at the ability to get the thing I want here: https://laravelcollective.com/docs/5.2/html#custom-macros where it says it's "easy" to define your own custom Form class helpers called "macros" but it doesn't actually tell you where you would write the code for this or where in the code you can look if you want to poke around and learn more about the FormBuilder class?
The method for doing this is Form::getValueAttribute('first_name') and the location for poking around to learn more is /vendor/laravelcollective/html/src/FormBuilder.php

Laravel 5 Captcha in Laravel 5 is not visible

I use Laravel 5.1 and this captcha package: https://github.com/mewebstudio/captcha.
When using this: {{Captcha::img()}} in my blade.php it doesn't show me the captch image. It just prints me out the following html:
<img src="http://localhost/myproject/public/captcha/default?xyD4gHW2" alt="captcha">
Any ideas why? Thank you
do this:
{!! Captcha::img() !!}}
from the docs:
https://laravel.com/docs/5.2/blade
By default, Blade {{ }} statements are automatically sent through
PHP's htmlentities function to prevent XSS attacks. If you do not want
your data to be escaped, you may use the following syntax:
Hello, {!! $name !!}. Note: Be very careful when echoing content that
is supplied by users of your application. Always use the double curly
brace syntax to escape any HTML entities in the content.

Form Model Binding in Laravel 4

I am building an edit details view and the basic purpose is to update the values entered previously. I read that the best way to do this would be using Form Model Binding. Nevertheless, this seems very risky as the interaction is happening directly on the model (and validation is taking place in controller.
What is your input on this? Is it the best approach to do edit data form?
Model form binding doesn't mean that it will automatically update the existing model with the data once it's posted -- you still need to manually write that logic. It's simply a way for when using laravels Form Builder i.e. Form::text('username') to attempt to automatically map the 'username' field and use it's value in the text. That's it. No data is automatically updated so simply using model form-binding isn't 'risky'
Instead of doing
Email: {{ Form::text('email', user.email) }}
Username: {{ Form::text('username', user.username) }}
You can simplify this by doing:
{{ Form::model(user) }}
Email: {{ Form::text('email') }}
Username: {{ Form::text('username') }}

Resources