在 Laravel 8 中,操作控制器 @store 未定义的问题

10

我还在探索Laravel 8,但我的控制器store()方法出了问题,“未定义”。

InvalidArgumentException 控制器PostsController@store未定义。 (视图:D:\Server\htdocs\app\resources\views\posts\create.blade.php)

我相信我已经定义了它,并使用了一个资源路由。

路由

Route::resource('posts', PostsController::class); 

刀片

@extends('layouts.app')

@section('content')
    <h1>Create Post</h1>

    {!! Form::open(['action' => 'PostsController@store', 'method' => 'POST']) !!}
    <div class="form-group">
        {{Form::label('title', 'Title')}}
        {{Form::label('title', ['class' => 'form-control','placeholder' =>'Title'])}}
    </div>
    <div class="form-group">
        {{Form::label('body', 'Body')}}
        {{Form::textarea('body', ['class' => 'form-control','placeholder' =>'Body'])}}
    </div>

    {{Form::submit('Submit',['class' =>'btn btn-primary'])}}
    {!! Form::close() !!}

@endsection

控制器

class PostsController extends Controller
{
    public function create()
    {
        return view('posts.create');
    }

    public function store(Request $request)
    {
        $this->validate($request, [
            'title' => 'required',
            'body' => 'required'
        ]);

        return 143;
    }
}

enter image description here


4
你尝试使用命名空间了吗?'\App\Http\Controllers\PostsController@store' - IGP
我应该把那个命名空间放在哪里? - lily
对不起,我可以了解更多关于这个包的信息吗?我有点不知所措。 - lily
3
你应该将那个命名空间放在操作中。或者,你可以使用route('posts.store')来使用已命名的路由。 - aynber
6个回答

20

如果你想在生成操作URL时添加命名空间前缀,可以进入RouteServiceProvider并将$namespace属性设置为App\Http\Controllers

否则,您应该通过完全限定类名(FQCN)引用您的控制器。

['action' => 'App\Http\Controllers\PostsController@store', ...]

我已经将$namespace更改为App\Http\Controllers,但我仍然遇到另一个错误:htmlentities() expects parameter 1 to be string, array given - lily
你是怎么解决的?htmlentities()函数期望第一个参数为字符串,但实际传入了数组。 - Julian Andres F M

0

我理解你遇到的问题。

你使用了。

{!! Form::open(['action' => 'PostsController@store', 'method' => 'POST']) !!}

这是错误的,你应该使用这个。

{!! Form::open(['url' => 'PostsController@store', 'method' => 'POST']) !!}

我希望你的问题能够得到解决。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

0

另外,您可以尝试在您的情况下使用命名路由,因为那是一个资源 PostsController,您应该将路由名称设置为posts.store

route('posts.store')

在 Laravel 服务容器中,PostsController@store 的定义中的参数将自动注入传入请求的实例。

我曾经遇到过类似的情况,但我没有使用资源控制器。因此,我必须显式地为该特定操作定义一个路由。


0

你应该在表单中使用路由而不是操作。尝试像这样:

{!! Form::open(['route' => 'products.store', 'method' => 'POST']) !!}

0

你需要声明一个路由,这样操作方法才能找到你所说的路由。

请参见此链接


0

这对我来说很有效,可以访问PostsController中的存储函数。

Form::open(['route' => 'posts.store'])

我的路由

Route::resource('posts','PostsController');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接