【问题标题】:laravel - livewire Full-Page Componentslaravel - livewire 整页组件
【发布时间】:2021-02-14 21:49:18
【问题描述】:

我使用 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

【问题讨论】:

  • Route::get('/xxx' , App\Http\Livewire\Counter::class); to Route::get('/xxx' , \App\Http\Livewire\Counter::class); 在App之前如果你把``theb它会从根级别考虑

标签: laravel laravel-8 laravel-livewire livewires


【解决方案1】:

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

use App\Http\Livewire\Counter;

在你的路线上:

Route::get('/xxx', Counter::class);

【讨论】:

  • 谢谢,但是:无效的路由操作:[App\Http\Controllers\App\Http\Livewire\Counter]。
【解决方案2】:

很遗憾,您将无法将受保护的 $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 中,它可以被删除以支持新的方式。

【讨论】:

    【解决方案3】:

    对于那些仍在寻找解决方案的人。我在将现有安装从 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');
       } 
     ...}
    

    Rendering Components

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

    Upgrading Livewire Routes.

    【讨论】:

    • 很高兴能帮上忙!
    • 这个答案应该是被接受的,因为它解决了问题,而马蒂亚斯的没有。
    • 非常感谢..它帮助我解决了错误:无效的路由操作
    • 谢谢,您为我节省了大量寻找解决方案的时间!
    【解决方案4】:

    为了不修改其命名空间的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

    【讨论】:

      【解决方案5】:

      已删除: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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-21
        • 2020-06-16
        • 2023-01-16
        • 2020-08-03
        • 2023-01-06
        • 2021-08-21
        • 2021-05-01
        • 1970-01-01
        相关资源
        最近更新 更多