Laravel 8.15.0/Jetstream - 如何注册新的 blades x-jet-newblade?

10

我刚开始使用 Laravel 8,发现了一个问题,但我无法解决。

/var/www/html/laravel/resources/views/dashboard.blade.php:

    <div class="py-12">
    <div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
        <div class="bg-white overflow-hidden shadow-xl sm:rounded-lg">
            <x-jet-welcome />
        </div>

如果我在同一目录中创建一个新的blade (例如: form.blade.php), 代码与上面的相同, 但是使用<x-jet-subform/>替换了<x-jet-welcome>, 它应该会正常重定向到subform.blade.php, 该文件位于var/www/html/laravel/resources/views/vendor/jetstream/components/subform.blade.php

但是如果我尝试进入该页面(在web.php设置路由后), 它会显示如下错误信息

InvalidArgumentException
无法找到组件 [jet-subform] 的类或视图。

所以我认为有必要"注册"新的blade,但我没有找到方法来实现...

这个视图已经通过以下方式发布:

php artisan vendor:publish --tag=jetstream-views
4个回答

18

您可以在位于app\Providers文件夹中的App\Providers\JetstreamServiceProvider.php中注册您的Jetstream Blade组件。

将以下帮助函数添加到文件中:


protected function registerComponent(string $component) {
    \Illuminate\Support\Facades\Blade::component('jetstream::components.'.$component, 'jet-'.$component);
}

接下来在注册函数中使用以下代码片段,以注册您的Jetstream Blade组件:

public function register() {
    $this->registerComponent('subform');
}

现在您可以使用自定义的Jetstream组件:

<x-jet-subform>

2
这个很好用,但是刀片位置很重要。我必须将它放在resources/views/vendor/jetstream/components中才能被识别。 - bfuzze
谢谢你的回答。我不明白为什么这必须手动完成。是否有计划进行更新? - AlexioVay
1
他们应该在Jetstream的文档中包含这个部分,我个人认为。 - Mario Ariyanto

14

我在这里遇到了同样的问题,并发现你的问题没有得到答复。我找到的解决方法是创建自己的新的Blade组件。您可以使用以下方式完成:

$ php artisan make:component MyComponent

这将会创建两个新文件 /resources/views/components/my-component.blade.php 和 /app/View/Components/MyComponent.php。 现在您只需要在该blade文件上构建组件,并使用x标签进行引用,如下所示: <x-my-component></x-my-component>

以下是blade组件代码的示例

<button {{ $attributes->merge(['type' => 'button', 'class' => 'some-classes']) }}> {{ $slot }} </button>

希望这有所帮助。来自巴西的问候 :)


1
谢谢你的帮助!这个方案对我有用,但是我不知道为什么不能使用Jetstream Blade而不是“普通”的Blade组件。 - operator
在教程中,他声称您可以通过在views/components文件夹内创建一个新的组件blade文件来添加新组件,但是我遇到了这个错误:无法找到组件的类或视图。我真的必须执行make:component吗?是否可以像@operator所要求的那样,通过添加新的blade文件来完成呢? - Pathros
1
有点后悔给这个回答点了个踩(抱歉),但我认为它没有准确回答问题,因为问题似乎是特定于Jetstream的。我认为@Saravanakumar提交的答案更准确。 - bfuzze

0

我认为这篇文章对于一些使用2023年及以后的人有所帮助,因为现在使用PHP 8.1+和Laravel 10已经发生了一些变化。

@Isaac Pontes 在3年前发布了一篇非常好的文章来手动添加组件。实际上,这应该在Jetstream官方文档中,但似乎没有得到很好的维护,这使得Jetstream真的是一个小众且难以找到好的解决方案。

然而,请查看此代码以解决OP遇到的相同问题:

class JetstreamServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     */
    public function register(): void
    {
        $this->registerComponent('label');
        $this->registerComponent('form-section');
        $this->registerComponent('action-message');
        $this->registerComponent('section-title');
        $this->registerComponent('confirms-password');
        $this->registerComponent('input-error');
    }

    protected function registerComponent(string $component) {
        \Illuminate\Support\Facades\Blade::component('vendor/jetstream/components/'.$component, 'jet-'.$component);
    }

通过这种方法,您可以手动注册JetStream组件并直接指向位于resources文件夹中的vendor/jetstream/components路径。

register()中,您可以手动添加所有缺失的组件以供每个页面视图使用。我主要是自己构建组件,但仍有一些例外情况需要使用JetStream组件。这将帮助其他遵循相同路线的人。


-3

我不确定这是否是正确或预期的方法来在此处添加新的自定义x-jet组件,因为此方法可能无法在更新后生存,但您可以在以下文件中注册新组件:

vendor/laravel/jetstream/src/JetstreamServiceProvider.php

在configureComponents方法中添加$this->registerComponent('subform');,然后使用<x-jet-subform>标记调用它。


4
正如你所写的那样,这个解决方案在包更新后将无法继续使用。 - codedge

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