目标 class [UserController] 不存在 Laravel 8
Target class [UserController] does not exist Laravel 8
我在访问控制器的路径上遇到问题,我已将 laravel 项目版本 5 复制到我的 laravel 版本 8 项目中,我已更改文件 RouteServiceProvider.php我的 laravel 项目在此
protected $namespace = 'App\Http\Controllers';
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
});
}
但仍然无法正常工作,错误消息显示“Illuminate\Contracts\Container\BindingResolutionException
目标 class [UserController] 不存在。"
这是web.php代码
<?php
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return view('welcome');
});
// Auth::routes();
// Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
Route::get('/', [HomeController::class, 'index'])->name('home');
Auth::routes();
Route::group(['middleware' => 'web'], function(){
Route::get('user/profil', 'App\Http\Controllers\UserController@profil')->name('user.profil');
Route::patch('user/{id}/change', 'App\Http\Controllers\UserController@changeProfil');
Route::get('transaksi/baru', 'App\Http\Controllers\PenjualanDetailController@newSession')->name('transaksi.new');
Route::get('transaksi/{id}/data', 'App\Http\Controllers\PenjualanDetailController@listData')->name('transaksi.data');
Route::get('transaksi/cetaknota', 'App\Http\Controllers\PenjualanDetailController@printNota')->name('transaksi.cetak');
Route::get('transaksi/notapdf', 'App\Http\Controllers\PenjualanDetailController@notaPDF')->name('transaksi.pdf');
Route::post('transaksi/simpan', 'App\Http\Controllers\PenjualanDetailController@saveData');
Route::get('transaksi/loadform/{diskon}/{total}/{diterima}', 'App\Http\Controllers\PenjualanDetailController@loadForm');
Route::resource('transaksi', 'App\Http\Controllers\PenjualanDetailController');
});
例如控制器
<?php
namespace App\Http\Controllers;
use \Illuminate\Http\Response;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User;
use Auth;
use Hash;
class UserController extends Controller
{
public function index()
{
return view('user.index');
}
public function listData()
{
$user = User::where('level', '!=', 1)->orderBy('id', 'desc')->get();
$no = 0;
$data = array();
foreach($user as $list){
$no ++;
$row = array();
$row[] = $no;
$row[] = $list->name;
$row[] = $list->email;
$row[] = '<div class="btn-group">
<a onclick="editForm('.$list->id.')" class="btn btn-primary btn-sm"><i class="fa fa-pencil"></i></a>
<a onclick="deleteData('.$list->id.')" class="btn btn-danger btn-sm"><i class="fa fa-trash"></i></a></div>';
$data[] = $row;
}
$output = array("data" => $data);
return response()->json($output);
}
public function store(Request $request)
{
$user = new User;
$user->name = $request['nama'];
$user->email = $request['email'];
$user->password = bcrypt($request['password']);
$user->level = 2;
$user->foto = "user.png";
$user->save();
}
public function edit($id)
{
$user = User::find($id);
echo json_encode($user);
}
public function update(Request $request, $id)
{
$user = User::find($id);
$user->name = $request['nama'];
$user->email = $request['email'];
if(!empty($request['password'])) $user->password = bcrypt($request['password']);
$user->update();
}
public function destroy($id)
{
$user = User::find($id);
$user->delete();
}
public function profil()
{
$user = Auth::user();
return view('user.profil', compact('user'));
}
public function changeProfil(Request $request, $id)
{
$msg = "succcess";
$user = User::find($id);
if(!empty($request['password'])){
if(Hash::check($request['passwordlama'], $user->password)){
$user->password = bcrypt($request['password']);
}else{
$msg = 'error';
}
}
if ($request->hasFile('foto')) {
$file = $request->file('foto');
$nama_gambar = "fotouser_".$id.".".$file->getClientOriginalExtension();
$lokasi = public_path('images');
$file->move($lokasi, $nama_gambar);
$user->foto = $nama_gambar;
$datagambar = $nama_gambar;
}else{
$datagambar = $user->foto;
}
$user->update();
echo json_encode(array('msg'=>$msg, 'url'=> asset('public/images/'.$datagambar)));
}
}
这是 user.profil.blade 的 blade 视图,例如
@extends('layouts.app')
@section('title')
Edit Profil
@endsection
@section('breadcrumb')
@parent
<li>user</li>
<li>edit profil</li>
@endsection
@section('content')
<div class="row">
<div class="col-xs-12">
<div class="box">
<form class="form form-horizontal" data-toggle="validator" method="post" enctype="multipart/form-data">
{{ csrf_field() }} {{ method_field('PATCH') }}
<div class="box-body">
<div class="alert alert-info alert-dismissible" style="display:none">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
<i class="icon fa fa-check"></i>
Perubahan berhasil disimpan.
</div>
<div class="form-group">
<label for="foto" class="col-md-2 control-label">Foto Profil</label>
<div class="col-md-4">
<input id="foto" type="file" class="form-control" name="foto">
<br><div class="tampil-foto"> <img src="{{ asset('public/images/'.Auth::user()->foto) }}" width="200"></div>
</div>
</div>
<div class="form-group">
<label for="passwordlama" class="col-md-2 control-label">Password Lama</label>
<div class="col-md-6">
<input id="passwordlama" type="password" class="form-control" name="passwordlama">
<span class="help-block with-errors"></span>
</div>
</div>
<div class="form-group">
<label for="password" class="col-md-2 control-label">Password</label>
<div class="col-md-6">
<input id="password" type="password" class="form-control" name="password">
<span class="help-block with-errors"></span>
</div>
</div>
<div class="form-group">
<label for="password1" class="col-md-2 control-label">Ulang Password</label>
<div class="col-md-6">
<input id="password1" type="password" class="form-control" data-match="#password" name="password1">
<span class="help-block with-errors"></span>
</div>
</div>
</div>
<div class="box-footer">
<button type="submit" class="btn btn-primary pull-right"><i class="fa fa-floppy-o"></i> Simpan Perubahan</button>
</div>
</form>
</div>
</div>
</div>
@endsection
@section('script')
<script type="text/javascript">
$(function(){
$('#passwordlama').keyup(function(){
if($(this).val() != "") $('#password, #password1').attr('required', true);
else $('#password, #password1').attr('required', false);
});
$('.form').validator().on('submit', function(e){
if(!e.isDefaultPrevented()){
$.ajax({
url : "{{ Auth::user()->id }}/change",
type : "POST",
data : new FormData($(".form")[0]),
dataType: 'JSON',
async: false,
processData: false,
contentType: false,
success : function(data){
if(data.msg == "error"){
alert('Password lama salah!');
$('#passwordlama').focus().select();
}else{
d = new Date();
$('.alert').css('display', 'block').delay(2000).fadeOut();
$('.tampil-foto img, .user-image, .user-header img').attr('src', data.url+'?'+d.getTime());
}
},
error : function(){
alert("Tidak dapat menyimpan data!");
}
});
return false;
}
});
});
</script>
@endsection
您遇到错误是因为您在 web.php 文件(例如 'App\Http\Controllers\UserController@profil' 中的每个路由上定义控制器名称空间以及设置值对于 RouteServiceProvider.php 中受保护的 $namespace 变量(例如 protected $namespace = 'App\Http\Controllers';)。
现在您需要做的是在 web.php 文件中的每个路由上定义控制器命名空间,或者在 RouteServiceProvider.php
中为受保护的 $namespace 变量提供值
你不能同时做这两件事。只需选择最适合您情况的套件即可。
从 RouteServiceProvider.php 文件中删除 protected $namespace = 'App\Http\Controller';
或删除已附加到 web.php 文件中每个路由的控制器命名空间。 (将 Route::get('user/profil', 'App\Http\Controllers\UserController@profil')->name('user.profil');
更改为 Route::get('user/profil', 'UserController@profil')->name('user.profil');
)一切正常。
对于 Laravel 文档参考,您可以阅读 https://laravel.com/docs/8.x/upgrade#routing
但是很多人会得到这个错误,因为他们习惯于定义他们的路线,比如
Route::get('/users','UserController@index);
在 Laravel 7 之前的 Laravel 版本中以这种方式定义它很好。但是 Laravel 8 改变了这种方法,而是提供了定义路由的新方法。
使用 PHP 可调用语法 Route::get('/users', [UserController::class, 'index']);
通过这种方式,您需要将控制器文件导入 web.php
或
使用字符串语法,即Route::get('/users', 'App\Http\Controllers\UserController@index');
我在访问控制器的路径上遇到问题,我已将 laravel 项目版本 5 复制到我的 laravel 版本 8 项目中,我已更改文件 RouteServiceProvider.php我的 laravel 项目在此
protected $namespace = 'App\Http\Controllers';
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
});
}
但仍然无法正常工作,错误消息显示“Illuminate\Contracts\Container\BindingResolutionException 目标 class [UserController] 不存在。"
这是web.php代码
<?php
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return view('welcome');
});
// Auth::routes();
// Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
Route::get('/', [HomeController::class, 'index'])->name('home');
Auth::routes();
Route::group(['middleware' => 'web'], function(){
Route::get('user/profil', 'App\Http\Controllers\UserController@profil')->name('user.profil');
Route::patch('user/{id}/change', 'App\Http\Controllers\UserController@changeProfil');
Route::get('transaksi/baru', 'App\Http\Controllers\PenjualanDetailController@newSession')->name('transaksi.new');
Route::get('transaksi/{id}/data', 'App\Http\Controllers\PenjualanDetailController@listData')->name('transaksi.data');
Route::get('transaksi/cetaknota', 'App\Http\Controllers\PenjualanDetailController@printNota')->name('transaksi.cetak');
Route::get('transaksi/notapdf', 'App\Http\Controllers\PenjualanDetailController@notaPDF')->name('transaksi.pdf');
Route::post('transaksi/simpan', 'App\Http\Controllers\PenjualanDetailController@saveData');
Route::get('transaksi/loadform/{diskon}/{total}/{diterima}', 'App\Http\Controllers\PenjualanDetailController@loadForm');
Route::resource('transaksi', 'App\Http\Controllers\PenjualanDetailController');
});
例如控制器
<?php
namespace App\Http\Controllers;
use \Illuminate\Http\Response;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User;
use Auth;
use Hash;
class UserController extends Controller
{
public function index()
{
return view('user.index');
}
public function listData()
{
$user = User::where('level', '!=', 1)->orderBy('id', 'desc')->get();
$no = 0;
$data = array();
foreach($user as $list){
$no ++;
$row = array();
$row[] = $no;
$row[] = $list->name;
$row[] = $list->email;
$row[] = '<div class="btn-group">
<a onclick="editForm('.$list->id.')" class="btn btn-primary btn-sm"><i class="fa fa-pencil"></i></a>
<a onclick="deleteData('.$list->id.')" class="btn btn-danger btn-sm"><i class="fa fa-trash"></i></a></div>';
$data[] = $row;
}
$output = array("data" => $data);
return response()->json($output);
}
public function store(Request $request)
{
$user = new User;
$user->name = $request['nama'];
$user->email = $request['email'];
$user->password = bcrypt($request['password']);
$user->level = 2;
$user->foto = "user.png";
$user->save();
}
public function edit($id)
{
$user = User::find($id);
echo json_encode($user);
}
public function update(Request $request, $id)
{
$user = User::find($id);
$user->name = $request['nama'];
$user->email = $request['email'];
if(!empty($request['password'])) $user->password = bcrypt($request['password']);
$user->update();
}
public function destroy($id)
{
$user = User::find($id);
$user->delete();
}
public function profil()
{
$user = Auth::user();
return view('user.profil', compact('user'));
}
public function changeProfil(Request $request, $id)
{
$msg = "succcess";
$user = User::find($id);
if(!empty($request['password'])){
if(Hash::check($request['passwordlama'], $user->password)){
$user->password = bcrypt($request['password']);
}else{
$msg = 'error';
}
}
if ($request->hasFile('foto')) {
$file = $request->file('foto');
$nama_gambar = "fotouser_".$id.".".$file->getClientOriginalExtension();
$lokasi = public_path('images');
$file->move($lokasi, $nama_gambar);
$user->foto = $nama_gambar;
$datagambar = $nama_gambar;
}else{
$datagambar = $user->foto;
}
$user->update();
echo json_encode(array('msg'=>$msg, 'url'=> asset('public/images/'.$datagambar)));
}
}
这是 user.profil.blade 的 blade 视图,例如
@extends('layouts.app')
@section('title')
Edit Profil
@endsection
@section('breadcrumb')
@parent
<li>user</li>
<li>edit profil</li>
@endsection
@section('content')
<div class="row">
<div class="col-xs-12">
<div class="box">
<form class="form form-horizontal" data-toggle="validator" method="post" enctype="multipart/form-data">
{{ csrf_field() }} {{ method_field('PATCH') }}
<div class="box-body">
<div class="alert alert-info alert-dismissible" style="display:none">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
<i class="icon fa fa-check"></i>
Perubahan berhasil disimpan.
</div>
<div class="form-group">
<label for="foto" class="col-md-2 control-label">Foto Profil</label>
<div class="col-md-4">
<input id="foto" type="file" class="form-control" name="foto">
<br><div class="tampil-foto"> <img src="{{ asset('public/images/'.Auth::user()->foto) }}" width="200"></div>
</div>
</div>
<div class="form-group">
<label for="passwordlama" class="col-md-2 control-label">Password Lama</label>
<div class="col-md-6">
<input id="passwordlama" type="password" class="form-control" name="passwordlama">
<span class="help-block with-errors"></span>
</div>
</div>
<div class="form-group">
<label for="password" class="col-md-2 control-label">Password</label>
<div class="col-md-6">
<input id="password" type="password" class="form-control" name="password">
<span class="help-block with-errors"></span>
</div>
</div>
<div class="form-group">
<label for="password1" class="col-md-2 control-label">Ulang Password</label>
<div class="col-md-6">
<input id="password1" type="password" class="form-control" data-match="#password" name="password1">
<span class="help-block with-errors"></span>
</div>
</div>
</div>
<div class="box-footer">
<button type="submit" class="btn btn-primary pull-right"><i class="fa fa-floppy-o"></i> Simpan Perubahan</button>
</div>
</form>
</div>
</div>
</div>
@endsection
@section('script')
<script type="text/javascript">
$(function(){
$('#passwordlama').keyup(function(){
if($(this).val() != "") $('#password, #password1').attr('required', true);
else $('#password, #password1').attr('required', false);
});
$('.form').validator().on('submit', function(e){
if(!e.isDefaultPrevented()){
$.ajax({
url : "{{ Auth::user()->id }}/change",
type : "POST",
data : new FormData($(".form")[0]),
dataType: 'JSON',
async: false,
processData: false,
contentType: false,
success : function(data){
if(data.msg == "error"){
alert('Password lama salah!');
$('#passwordlama').focus().select();
}else{
d = new Date();
$('.alert').css('display', 'block').delay(2000).fadeOut();
$('.tampil-foto img, .user-image, .user-header img').attr('src', data.url+'?'+d.getTime());
}
},
error : function(){
alert("Tidak dapat menyimpan data!");
}
});
return false;
}
});
});
</script>
@endsection
您遇到错误是因为您在 web.php 文件(例如 'App\Http\Controllers\UserController@profil' 中的每个路由上定义控制器名称空间以及设置值对于 RouteServiceProvider.php 中受保护的 $namespace 变量(例如 protected $namespace = 'App\Http\Controllers';)。
现在您需要做的是在 web.php 文件中的每个路由上定义控制器命名空间,或者在 RouteServiceProvider.php
中为受保护的 $namespace 变量提供值你不能同时做这两件事。只需选择最适合您情况的套件即可。
从 RouteServiceProvider.php 文件中删除 protected $namespace = 'App\Http\Controller';
或删除已附加到 web.php 文件中每个路由的控制器命名空间。 (将 Route::get('user/profil', 'App\Http\Controllers\UserController@profil')->name('user.profil');
更改为 Route::get('user/profil', 'UserController@profil')->name('user.profil');
)一切正常。
对于 Laravel 文档参考,您可以阅读 https://laravel.com/docs/8.x/upgrade#routing
但是很多人会得到这个错误,因为他们习惯于定义他们的路线,比如
Route::get('/users','UserController@index);
在 Laravel 7 之前的 Laravel 版本中以这种方式定义它很好。但是 Laravel 8 改变了这种方法,而是提供了定义路由的新方法。
使用 PHP 可调用语法
Route::get('/users', [UserController::class, 'index']);
通过这种方式,您需要将控制器文件导入 web.php或
使用字符串语法,即
Route::get('/users', 'App\Http\Controllers\UserController@index');