Laravel 8 与 laravelcollective/html 6.2,Action Controller@function 未定义
Laravel 8 with laravelcollective/html 6.2, Action Controller@function not defined
我是 Laravel 和 Whosebug
的新手
当Laravel7发布的时候,我开始学习Laravel。
前不久推出了新的8.0版本,开始试用了
我无法确定问题是由 Laravel 的较新版本或任何配置错误引起的。
当我尝试以下操作时 (edit.blade.php)
{!! Form::open(['action' => ['ProductController@update', $product->id], 'method' => 'POST']) !!}
或
{!! Form::open(['action' => [[ProductController::class, 'update'], $product->id], 'method' => 'POST']) !!}
发生错误
操作 ProductController@update 未定义
然后我尝试用类似
的路径替换控制器名称
{!! Form::open(['action' => ['App\Http\Controllers\ProductController@update', $product->id], 'method' => 'POST']) !!}
或
{!! Form::open(['action' => [[App\Http\Controllers\ProductController::class, 'update'], $product->id], 'method' => 'POST']) !!}
有效!
所以我认为这是关于命名空间的
但我有一个命名空间标题
namespace App\Http\Controllers;
在我的 App\Http\ProductController.php
虽然我可以通过在集合形式中输入控制器的完整路径来解决问题,
我担心我的代码有配置错误或者语法错误等等
这是对 Laravel 8 的更改。默认情况下没有命名空间前缀应用于您的路由,并且在生成“操作”的 URL 时也没有使用命名空间前缀。
要在生成操作的 URL 时将命名空间作为您尝试引用的控制器的前缀,您需要在 App\Providers\RouteServiceProvider
上定义 $namespace
属性:
protected $namespace = 'App\Http\Controllers';
现在您可以使用该名称空间前缀引用您的操作:
Form::open(['action' => ['ProductController@update', $product->id], 'method' => 'POST'])
在Laravel 8中:使用这段代码我认为你的问题会得到解决
web.php
Route::middleware(['auth:sanctum', 'verified'])->group(function () {
Route::get('create', 'Product\ProductController@Create')->name('product.create')->middleware('can:Add Product');
Route::post('create', 'Product\ProductController@Store')->name('product.store')->middleware('can:Add Product');
});
resources/views/product:
<form method="post" action="{{ route('product.store') }}" enctype="multipart/form-data">
@csrf
{{-- START - PRODUCT INFORMATION --}}
{{-- END- PRODUCT INFORMATION --}}
</form>
app/Http/Controllers/Products:
<?php
namespace App\Http\Controllers\Products;
use App\Http\Requests\Product\ProductRequest;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class ProductController extends Controller {
//---Constructor Function
public function __construct() {
$this->middleware('auth:sanctum');
}//---End of Function Constructor
//---Create Product
public function create() {
return view('product.product_add');
}//---End of Function create
//---Store Product in Database
public function store(ProductRequest $request) {
//---Add Product Details in DB
}
?>
Laravel 8 :集体形式 - 这用于创建 Laravel 查看页面
{!! Form::open(['route' => '', 'id'=>'form','class' => 'needs-validation',]) !!}
<div class="form-group row">
{!! Form::label('employee_id', 'Employee ID:', ['class'=>'col-md-1 col-form-label custom_required']) !!}
<!-- Employee ID -->
<div class="form-group row">
{!! Form::label('employee_name', 'Employee Name:', ['class'=>'col-md-1 col-form-label custom_required']) !!}
<div class="col-lg-8">
{!! Form::text('employee_name', @$employee_id, ['class' => 'form-control', 'required', 'placeholder' => 'Employee Name', 'pattern'=> '^[a-z A-Z0-9_.-]*$']) !!}
</div>
<!-- Employee number -->
<div class="form-group row">
{!! Form::label('phone_number', 'Number:', ['class'=>'col-md-1 col-form-label custom_required']) !!}
<div class="col-lg-8">
{!! Form::text('phone_number', @$phone_number, ['class' => 'form-control', 'required','placeholder' => 'number']) !!}
</div>
{!! Form::close() !!}
我是 Laravel 和 Whosebug
的新手当Laravel7发布的时候,我开始学习Laravel。 前不久推出了新的8.0版本,开始试用了
我无法确定问题是由 Laravel 的较新版本或任何配置错误引起的。
当我尝试以下操作时 (edit.blade.php)
{!! Form::open(['action' => ['ProductController@update', $product->id], 'method' => 'POST']) !!}
或
{!! Form::open(['action' => [[ProductController::class, 'update'], $product->id], 'method' => 'POST']) !!}
发生错误
操作 ProductController@update 未定义
然后我尝试用类似
的路径替换控制器名称{!! Form::open(['action' => ['App\Http\Controllers\ProductController@update', $product->id], 'method' => 'POST']) !!}
或
{!! Form::open(['action' => [[App\Http\Controllers\ProductController::class, 'update'], $product->id], 'method' => 'POST']) !!}
有效!
所以我认为这是关于命名空间的
但我有一个命名空间标题
namespace App\Http\Controllers;
在我的 App\Http\ProductController.php
虽然我可以通过在集合形式中输入控制器的完整路径来解决问题, 我担心我的代码有配置错误或者语法错误等等
这是对 Laravel 8 的更改。默认情况下没有命名空间前缀应用于您的路由,并且在生成“操作”的 URL 时也没有使用命名空间前缀。
要在生成操作的 URL 时将命名空间作为您尝试引用的控制器的前缀,您需要在 App\Providers\RouteServiceProvider
上定义 $namespace
属性:
protected $namespace = 'App\Http\Controllers';
现在您可以使用该名称空间前缀引用您的操作:
Form::open(['action' => ['ProductController@update', $product->id], 'method' => 'POST'])
在Laravel 8中:使用这段代码我认为你的问题会得到解决
web.php
Route::middleware(['auth:sanctum', 'verified'])->group(function () {
Route::get('create', 'Product\ProductController@Create')->name('product.create')->middleware('can:Add Product');
Route::post('create', 'Product\ProductController@Store')->name('product.store')->middleware('can:Add Product');
});
resources/views/product:
<form method="post" action="{{ route('product.store') }}" enctype="multipart/form-data">
@csrf
{{-- START - PRODUCT INFORMATION --}}
{{-- END- PRODUCT INFORMATION --}}
</form>
app/Http/Controllers/Products:
<?php
namespace App\Http\Controllers\Products;
use App\Http\Requests\Product\ProductRequest;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class ProductController extends Controller {
//---Constructor Function
public function __construct() {
$this->middleware('auth:sanctum');
}//---End of Function Constructor
//---Create Product
public function create() {
return view('product.product_add');
}//---End of Function create
//---Store Product in Database
public function store(ProductRequest $request) {
//---Add Product Details in DB
}
?>
Laravel 8 :集体形式 - 这用于创建 Laravel 查看页面
{!! Form::open(['route' => '', 'id'=>'form','class' => 'needs-validation',]) !!}
<div class="form-group row">
{!! Form::label('employee_id', 'Employee ID:', ['class'=>'col-md-1 col-form-label custom_required']) !!}
<!-- Employee ID -->
<div class="form-group row">
{!! Form::label('employee_name', 'Employee Name:', ['class'=>'col-md-1 col-form-label custom_required']) !!}
<div class="col-lg-8">
{!! Form::text('employee_name', @$employee_id, ['class' => 'form-control', 'required', 'placeholder' => 'Employee Name', 'pattern'=> '^[a-z A-Z0-9_.-]*$']) !!}
</div>
<!-- Employee number -->
<div class="form-group row">
{!! Form::label('phone_number', 'Number:', ['class'=>'col-md-1 col-form-label custom_required']) !!}
<div class="col-lg-8">
{!! Form::text('phone_number', @$phone_number, ['class' => 'form-control', 'required','placeholder' => 'number']) !!}
</div>
{!! Form::close() !!}