Laravel Nullable is not working, i try everything but it still not working. Please Look My Code..
Controller :-
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Pop;
class PopController extends Controller
{
public function index(){
return view('test2');
}
public function create(Request $request){
$formvalidtion = $request->validate([
'usercode' => ['nullable', 'required'],
]);
return "<h1>SUCCESS</h1>";
}
}
Model :-
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Pop extends Model
{
protected $timestamps = false;
protected $fillable = ['usercode'];
}
Migration :-
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePopsTable extends Migration
{
/**
* Run the migrations.
*
* #return void
*/
public function up()
{
Schema::create('pops', function (Blueprint $table) {
$table->bigIncrements('id');
$table->integer('usercode')->nullable();
});
}
/**
* Reverse the migrations.
*
* #return void
*/
public function down()
{
Schema::dropIfExists('pops');
}
}
Route :-
route::get('test', 'PopController#index');
route::post('testcheck', 'PopController#create')->name('uc');
View :-
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Nullable Test</title>
</head>
<body>
<h1>Test Nullable</h1>
<form action="{{ route('uc') }}" method="POST">
#csrf
<input type="number" name="usercode" id="" placeholder="Enter User Code">
#error('usercode')
{{ $message }}
#enderror
<br>
<input type="submit" >
</form>
</body>
</html>
I spend 1 hour to find solution of but not get. some of youtube video in mentioned that datatype of field must be int and nullable . this also not working is there any solution available?
It's not right to use nullable and required validations rules together:
required: The field under validation must be present in the input data and not empty.
nullable: The field under validation may be null.
present: The field under validation must be present in the input data but can be empty.
filled: The field under validation must not be empty when it is present.
prohibited: The field under validation must be empty or not present.
sometimes: The field under validation will only be validated if it is present.
exclude: The field under validation will be excluded from the request data returned by the validate and validated methods.
You may use nullable and present together:
$formvalidtion = $request->validate([
'usercode' => ['nullable', 'present'],
]);
You don't specify what you mean with "not working" (i.e. what you expect, but what happens instead), but I'm assuming you mean that null values are not accepted by the validation.
That would be because the required rule expects a value to be non-empty. So your nullable rule probably passes, but required fails.
If you want a value to be present, but not necessarily non-empty, you can use the present rule.
Related
Employees.php file
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
/**
* #method static find($id)
*/
class Employees extends Model
{
use HasFactory;
protected $table = 'employees';
public $timestamps = false;
}
EmployeesController.php
<?php
namespace App\Http\Controllers;
use App\Models\Employees;
class EmployeesController extends Controller
{
public function employees_salaries()
{
return view('director.employees_salaries');
}
public function employees()
{
$employees = Employees::all();
return view('director.employees', ['employees'=>$employees]);
}
public function destroy($id)
{
$employees = Employees::find($id);
$employees->delete();
return redirect('/director.employees')->with('status', 'Your Data is Deleted');
}
}
employees.blade.php file
<from action="/delete/{{$employee->id}}" method="POST">
#csrf
#method('DELETE')
<button type="submit" class="btn btn-delete btn-form me-3">
Delete
</button>
</from>
route.php file
Route::match(['get', 'post'], '/employees', array(EmployeesController::class, 'employees'))->name('employees');
Route::delete('/delete/{id}', array(EmployeesController::class, 'destroy'))->name('delete');
I cleared the cache but have no idea what the problem is. it looks like I wrote the function correctly
p.s version Laravel 9
mySQL 8
phpMyAdmin
Welcome to SO, i think youre not using the variable you assigned the value into,from controller in your blade view. maybe try to make sure you have the right variable or maybe try to use var dump.
try to put this in your controller b4 parsing value to view, to check whether you get the data you wanted or not
dd('$employees');
make sure you use the variable you assigned in your controller to your view
<?php
namespace App\Http\Controllers;
use App\Models\Employees;
class EmployeesController extends Controller
{
public function employees_salaries()
{
return view('director.employees_salaries');
}
public function employees()
{
$employees = Employees::all();
return view('director.employees', ['employees'=>$employees]); //<< here you name the variable 'employees'
}
public function destroy($id)
{
$employees = Employees::find($id);
$employees->delete();
return redirect('/director.employees')->with('status', 'Your Data is Deleted');
}
}
change this variable in view
<from action="/delete/{{$employee->id}}" method="POST"> //<< this one you use '$employee' instead of '$employees'
#csrf
#method('DELETE')
<button type="submit" class="btn btn-delete btn-form me-3">
Delete
</button>
</from>
there might also be other problem, but for now thats what i can point out.
since im also learning.
I am trying to send an auto-reply to the newly registered user and I want to send them an image rather than the text but when I try to send the image the mail does send but the image received is broken. I studied many answers from StackOverflow as well tried many other solutions from the internet but nothing seems to be working.
My mail class:
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class autoMail extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*
* #return void
*/
public function __construct()
{
//
}
/**
* Build the message.
*
* #return $this
*/
public function build()
{
return $this->subject("Subject")
->view('emails.autoemail');
}
}
Here is my function which is calling this mail class.
Mail::to($request->email)->send(new autoMail());
And last but not least my view which I am sending as an email.
<!DOCTYPE html>
<html>
<head>
<title>Auto Email</title>
</head>
<body>
<img src="{{ asset('img/email.png') }}">
</body>
</html>
You can manually pass your data to the view via the with() method.
class autoMail extends Mailable
{
use Queueable, SerializesModels;
public function build()
{
$image = env('APP_URL')."/img/email.png";
return $this->subject("Subject")
->view('emails.autoemail')
->with(['image' => $image]);
}
}
Once the data has been passed to the with() method, it will automatically be available in your view, so you may access it like you would access any other data in your Blade templates:
<!DOCTYPE html>
<html>
<head>
<title>Auto Email</title>
</head>
<body>
<img src="{{ $image }}">
</body>
</html>
In my app I have a users table and a profiles table. When a user goes to their dashboard, they should be able to click a link to view their profile page. Here's the link:
link to your profile page
However, I am getting the error: Route [profiles.show] not defined.
I'm a novice and am not clear on how to link a signed up user with his/her profile page. All users should have a profile page on sign up.
I'd appreciate some guidance! Here is what I have so far:
The link to profile page
link to your profile page
ProfilesController.php
namespace App\Http\Controllers;
use App\Profile;
use Illuminate\Http\Request;
class ProfilesController extends Controller
{
public function show($id)
{
$profile = Profile::find($id);
return view('profiles.show', compact('profile'));
}
}
Profile.php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Profile extends Model
{
public function user()
{
return $this->belongsTo('User');
}
}
routes/web.php
Route::get('pages/profiles', 'ProfilesController#show');
profiles.blade.php
This is just a very simple page for now.
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h1>{{ $user->user_id }}</h1>
<p>{{ $user->about_me }}</p>
</body>
</html>
Solution
I found an easy solution and I wanted to post it here to help others who might be struggling with creating a user profile page. The below assumes you already have a users table in your database and now you want to create a profiles table and connect user ID to their profile page.
Adding Laravel User Profiles
This is the video which help me.
Create table
php artisan make:migration create_profiles_table
This creates a migration file:
2019_09_22_213316_create_profiles_table
Open migration file and add extra columns you need:
$table->integer('user_id')->unsigned()->nullable();
$table->string('about_me')->nullable();
Migrate these to database
php artisan migrate
Now we have our database sorted, we need to create a controller to control how our php functions.
ProfilesController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ProfilesController extends Controller
{
public function show($user_id)
{
$user = User::find(1);
$user_profile = Profile::info($user_id)->first();
return view('profiles.show', compact('profile', 'user'));
}
public function profile()
{
return $this->hasOne('Profile');
}
}
routes/web.php
Route::get('dashboard/profile', 'ProfilesController#show');
Profile.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Profile extends Model
{
public function user()
{
return $this->belongsTo('User');
}
}
Add this to User.php
public function profile()
{
return $this->hasOne('Profile');
}
profile.blade.php
Create any design you want. If you want to pull in users name, include {{ Auth::user()->name }}
try this
Route::get('pages/profiles/{id}', 'ProfilesController#show')->name('profiles.show');
Because in link you use a name route but in web.php there is no name route called profiles.show.so it's show error.And In Route You Need To pass the ID.
At Blade File :
link to your profile page
Change Route Style like below :
Route::get('pages/profiles/{id}', 'ProfilesController#show')->name('profiles.show');
At Profile Model
public function user()
{
return $this->belongsTo(User::class);
}
In Profiles.blade.php
<body>
<h1>{{ $profile->id }}</h1>
<p>{{ $profile->about_me }}</p>
</body>
You Passed User information through "profile" parameter. So you have to write this name in blade file.
Note Route Function won't work if you don't mentioned any name for this Route name. Either you have to use URL.
Your route is wrong, take a look at named routes. If you don't use Route::resource(), you have to manually name your routes and specify when you are expecting a parameter (in this case the profile ID).
Route::get('pages/profiles/{id}', 'ProfilesController#show')->name('profiles.show');
link to your profile page
Route model binding is probably the way to go in this case.
Route::get('pages/profiles/{profile}', 'ProfilesController#show')->name('profiles.show');
namespace App\Http\Controllers;
use App\Profile;
use Illuminate\Http\Request;
class ProfilesController extends Controller
{
public function show(Profile $profile)
{
return view('profiles.show', compact('profile'));
}
}
Im having an issue where this code just executes and the vardump shows the var i put in the text field but theres no data showing up in the database, theres also no error showing up
view:
<!DOCTYPE html>
<html>
<head>
<link href="https://fonts.googleapis.com/css?family=Lato:100" rel="stylesheet" type="text/css">
<body>
<div>
<form method="post" action="/post">
{{ csrf_field() }}
<input type="text" name="email">
<input type="text" name="password">
<input type="submit" name="submit">
</form>
</div>
</body>
</head>
</html>
controller:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\werknemer_model;
class werknemer extends Controller
{
/*Show the form for creating a new resource.*/
public function create(Request $request)
{
$email = $request->input('email');
var_dump($email);
$werknemer = new werknemer();
$werknemer->store($request);
return view('login_portal');
}
}
model:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use App\controllers\werknemer
class werknemer_model extends Model
{
public function store (Request $request){
$email = $request->input('email');
$password = $request->input('password');
$werknemer = new werknemer;
$werknemer->id = 1;
$werknemer->bedrijf_id = 1;
$werknemer->email = $email;
$werknemer->naam = $password;
$werknemer->save();
try {
DB::connection()->getPdo();
} catch (\Exception $e) {
die("Could not connect to the database. Please check your configuration.");
}
}
}
Routes:
Route::get('/', function () {
return view('Login_portal');
});
Route::post('/post','werknemer#create');
Question : My data isnt being saved to database and im not getting an error
It is common problem, easy to forgot. You forgot to set variable in your model (for Mass Assignment). Check what data you want to put to database and set it in your model.
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* The attributes that are mass assignable.
*
* #var array
*/
protected $fillable = ['name', 'another_data', 'another_variable'];
}
And as far as I see, your model structure is not going along the Laravel convention. Read it and save time in future: https://laravel.com/docs/5.6/eloquent#mass-assignment
I have a form that only have control on action URL. so cannot add '_token'. is that possible to get the data to my controller
External HTML form host in deference location
<!DOCTYPE html>
<html>
<head>
<title>Test HTML</title>
</head>
<body>
<form method="post" action="http://www.mylaravelproject.com/confirm">
<input type="textbox" name="fname">
<input type="textbox" name="lname">
<input type="submit">
</form>
</body>
</html>
My Laravel Route
Route::any('confirm','PageController#confirm');
Inside Controller
public function confirm(){
return Input::all();
}
Is this Possible ??
Thanks
Edit:
Found i can do that by removing line (inside App/Httm/Kenel.php)
'App\Http\Middleware\VerifyCsrfToken',
Second Question
but its kind of security risk. i Just only need to remove VerifyCsrfToken on this specific route 'confirm'.
is this possible?
This feature will be available in Laravel 5.1 out of the box.
But while we wait for Laravel 5.1 - you can do this in your App\Http\Middleware\VerifyCsrfToken file in 5.0:
<?php namespace App\Http\Middleware;
use Closure;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
use Illuminate\Session\TokenMismatchException;
class VerifyCsrfToken extends BaseVerifier {
protected $excludedRouteGroups = ['confirm', 'stripe'];
public function handle($request, Closure $next)
{
if ($this->isReading($request) || ($this->excludedRoutes($request)) || $this->tokensMatch($request)) {
return $this->addCookieToResponse($request, $next($request));
}
Throw new TokenMismatchException;
}
protected function excludedRoutes($request)
{
foreach($this->excludedRouteGroups as $route) {
if ($request->segment(1) === $route) {
return true;
}
}
return false;
}
}