2

我使用 laravel 8。

我在以下位置定义受保护的命名空间RouteServiceProvider

protected $namespace = 'App\Http\Controllers';

然后通过以下路线使用livewire:

Route::get('/xxx' , App\Http\Livewire\Counter::class);

但我有以下错误:

Invalid route action: [App\Http\Controllers\App\Http\Livewire\Counter].

注意:这增加App\Http\Controllers了我的第一个动作!!!如果全部删除protected $namespace就可以了。但我不想删除它。

有没有办法让我同时拥有 ‍<code>controller protected namespace (for controller namespace) 和Route::getfor Full-Page Components

4

5 回答 5

12

对于那些仍在寻找解决方案的人。我在将现有安装从 Laravel 7 升级到 8 并添加了一些新的 Livewire 组件时遇到了这个问题。

您应该能够像这样直接在 Route 中调用该类,

Route::get('/blog', [\App\Http\Livewire\Pages\ShowPosts::class, '__invoke'])->name('blogs');

这应该允许您使用 Laravel 常规网络路由。

然后在您的 Livewire 组件中,您可以像这样扩展布局,

class ShowPosts extends Component{
   ...
   public function render(){
       return view('livewire.show-posts')
        ->layout('layouts.base');
   } 
 ...}

渲染组件

另一种选择是从路由中删除命名空间,如下面的链接中所述。

升级 Livewire 路由

于 2021-01-08T02:20:19.270 回答
3

不幸的是,您将无法将受保护的 $namespace 与 Livewire 一起使用。您必须将其注释掉并将所有路线更新到 laravel 8 方式:https ://laravel.com/docs/8.x/releases#routing-namespace-updates

因为 livewire 组件不在 App\Http\Controllers 下,所以使用 $namespace 将永远无法工作。

据我了解。由于 Laravel 7 中的这个问题,Livewire 1.x 中存在 Route::livewire。但是在 Laravel 8 中它可以被删除以支持新的方式。

于 2020-11-02T22:25:04.150 回答
0

为了不修改RouteServiceProvider.php其名称空间的文件,请将app\Http\Livewire目录移动到app\Http\Controllers\Livewire.

改变这个

namespace App\Http\Livewire;

use Livewire\Component;

class Counter extends Component
{
    //
}

对此

namespace App\Http\Controllers\Livewire; // <---- added Controllers

use Livewire\Component;

class Counter extends Component
{
    //
}

config/livewire从此修改文件

'class_namespace' => 'App\\Http\\Livewire',

对此

'class_namespace' => 'App\\Http\\Controllers\\Livewire', // <---- Controllers added
  • 然后取出里面的东西bootstrap\cache
  • 然后运行composer dumpautoload

之后,您使用php artisan livewire:make, 制作的任何新 livewire 都应进行修改。您应该更改namespace App\Http\Livewirenamespace App\Http\Controllers\Livewire.

于 2021-11-09T11:16:38.070 回答
0

删除:Route::livewire()

Livewire 1.x 允许您使用 Route::livewire() 方法为整个页面注册一个带有路由的组件。Livewire 2.0 现在允许您使用标准 Route::get() 方法和完全限定的命名空间将 Livewire 组件直接传递到路由中。

Route::livewire('/post', 'show-posts');

Route::get('/post', \App\Http\Livewire\ShowPosts::class);
于 2022-01-02T06:34:47.710 回答
-1

您可以尝试在开头添加您的 livewire 组件web.php

use App\Http\Livewire\Counter;

在您的路线中:

Route::get('/xxx', Counter::class);
于 2020-11-02T10:57:05.270 回答