laravel - livewire 全页组件
laravel - livewire Full-Page Components
我用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
一切正常。但是我不想删除它。
有没有办法让我同时拥有 controller protected namespace
(用于控制器命名空间)和 Route::get
用于 Full-Page Components
?
您可以尝试在 web.php
的开头添加您的 livewire 组件:
use App\Http\Livewire\Counter;
在你的路线中:
Route::get('/xxx', Counter::class);
很遗憾,您将无法将受保护的 $namespace 与 Livewire 一起使用。
您必须将其注释掉并将所有路线更新为 laravel 8 方式:https://laravel.com/docs/8.x/releases#routing-namespace-updates
因为 livewire 组件不在 App\Http\Controllers 下,使用 $namespace 永远行不通。
据我了解。由于 Laravel 7 中的这个问题,Route::livewire 存在于 Livewire 1.x 中。但是对于 Laravel 8 它可以被删除以支持新的方式。
对于那些仍在寻找解决方案的人。我 运行 在将现有安装从 Laravel 7 升级到 8 并添加了一些新的 Livewire 组件时遇到了这个问题。
您应该可以像这样直接在路由中调用 class,
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');
}
...}
另一种选择是从路由中删除命名空间,如下文 link 所述。
为了不修改其命名空间的 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\Livewire
更改为 namespace App\Http\Controllers\Livewire
。
已删除: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);
我用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
一切正常。但是我不想删除它。
有没有办法让我同时拥有 controller protected namespace
(用于控制器命名空间)和 Route::get
用于 Full-Page Components
?
您可以尝试在 web.php
的开头添加您的 livewire 组件:
use App\Http\Livewire\Counter;
在你的路线中:
Route::get('/xxx', Counter::class);
很遗憾,您将无法将受保护的 $namespace 与 Livewire 一起使用。 您必须将其注释掉并将所有路线更新为 laravel 8 方式:https://laravel.com/docs/8.x/releases#routing-namespace-updates
因为 livewire 组件不在 App\Http\Controllers 下,使用 $namespace 永远行不通。
据我了解。由于 Laravel 7 中的这个问题,Route::livewire 存在于 Livewire 1.x 中。但是对于 Laravel 8 它可以被删除以支持新的方式。
对于那些仍在寻找解决方案的人。我 运行 在将现有安装从 Laravel 7 升级到 8 并添加了一些新的 Livewire 组件时遇到了这个问题。
您应该可以像这样直接在路由中调用 class,
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');
}
...}
另一种选择是从路由中删除命名空间,如下文 link 所述。
为了不修改其命名空间的 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\Livewire
更改为 namespace App\Http\Controllers\Livewire
。
已删除: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);