php 基于Laravel类的组件类被忽略

e0uiprwp  于 2023-06-20  发布在  PHP
关注(0)|答案(2)|浏览(132)

我在app/view/components/modules/Exchange/common的嵌套文件夹中创建了laravel组件
我在代码中这样使用这个组件:

<x-modules.Exchange.common.text-input placeholder="{{ __('Email') }}"
                                label="{{ __('Email') }}" icon="ni ni-envelope" id="email_input"
                                name="account_email" />

问题是完全忽略了具有构造函数和默认值组件类
Laravel直接呈现与该组件关联的blade.php。
当然,没有默认值被传递到刀片,这就是为什么我得到这个错误:

Error ! with http_status: 500
Undefined variable $type (View: /var/www/html/laravel/resources/views/components/modules/Exchange/common/text-input.blade.php) (View: /var/www/html/laravel/resources/views/components/modules/Exchange/common/text-input.blade.php)

在我的开发环境(Windows)中,它可以正常工作,并且调用了类构造函数,但是,当我部署到ECS Linux时,我得到了这个错误。
我的所有组件都出现了这个错误。
我尝试了composer dum-autoloadphp artisan view:clearphp artisan cache:clearphp artisan config:clear,并尝试注册组件。
有人能帮我解决这个问题吗?我在Linux上使用

Laravel 9.41.0
PHP 8.1.2

先谢谢你了。
编辑:我所有的课程都符合PSR-4编辑:TextInput类

<?php

namespace App\View\Components\modules\Exchange\common;

use Illuminate\View\Component;

class TextInput extends Component
{
    public $icon = null;

    public $name = '';

    public $placeholder = '';

    public $label = '';

    public $id = null;

    public $type = 'text';

    public $tab_index = 0;

    public $value = null;

    public $on_change = null;

    public $on_key_down = null;

    public $is_read_only;

    public $class;

    public function __construct(
        $label = '',
        $name = '',
        $icon = null,
        $placeholder = '',
        $id = null,
        $type = 'text',
        $tabIndex = 0,
        $value = null,
        $onChange = null,
        $isReadOnly = false,
        $onKeyDown = null,
        $class = '',
    ) {
        $this->icon = $icon;
        $this->name = $name;
        $this->label = $label;
        $this->placeholder = $placeholder;
        $this->id = $id;
        $this->type = $type;
        $this->tab_index = $tabIndex;
        $this->value = $value;
        $this->on_change = $onChange;
        $this->on_key_down = $onKeyDown;
        $this->is_read_only = $isReadOnly;
        $this->class = $class;
    }

    /**
     * Get the view / contents that represent the component.
     *
     * @return \Illuminate\Contracts\View\View|\Closure|string
     */
    public function render()
    {
        return view('components.modules.Exchange.common.text-input');
    }
}

test-input.blade.php

<div class="form-group w-100" tabindex="">
    @if (isset($label))
        <label class="form-label" for="{{ $id }}">{{ __($label) }}</label>
    @endif
    <div class="input-group">
        @if ($icon)
            <div class="input-group-prepend">
                <span class="input-group-text"><i class="{{ $icon }}"></i></span>
            </div>
        @endif
        @if ($type != 'text_area')
            <input {{ $is_read_only ? 'readonly' : '' }} @if ($type == 'number') step="0.01" @endif
                type="{{ $type }}" name="{{ $name }}"
                @if ($id) id="{{ $id }}" @endif
                @if ($type != 'checkbox') class="form-control {{ $class }}" @endif
                placeholder="{{ __($placeholder) }}" tabindex="{{ $tab_index }}" value="{{ $value }}"
                onchange="{{ $on_change }}" onkeydown="{{ $on_key_down }}">
        @else
            <textarea {{ $is_read_only ? 'readonly' : '' }} rows="3" name="{{ $name }}"
                @if ($id) id="{{ $id }}" @endif class="form-control {{ $class }}"
                placeholder="{{ __($placeholder) }}" tabindex="{{ $tab_index }}" value="{{ $value }}"
                onchange="{{ $on_change }}" onkeydown="{{ $on_key_down }}"></textarea>
        @endif

    </div>
</div>
b09cbbtk

b09cbbtk1#

经过大量的搜索和实验,我找到了解决方案。
我在做

<x-modules.Exchange.common.text-input placeholder="{{ __('Email') }}"
                                label="{{ __('Email') }}" icon="ni ni-envelope" id="email_input"
                                name="account_email" />

对吧?
我需要将组件路径中的每个单词大写,就像下面这样:x-Modules.Exchange.Common
然后沿着这个路径大写文件夹名称,它立即工作。
所以我假设Laravel大写基于类的组件路径,并试图找到它们,然后操作系统开始发挥作用,如果它是大小写不敏感的,它会找到组件类,而不是(在Linux的情况下)你必须大写你的文件夹名称,让操作系统找到它。

jc3wubiy

jc3wubiy2#

感谢您提供额外的代码片段。以下是我的最新回应。
在Laravel的Blade模板中,当使用组件时,组件的属性需要在包含组件时被***显式传递***。如果没有显式传递相应的属性,则不会自动使用组件类本身中设置的默认值。
构造函数负责根据组件包含期间传递的值初始化属性。所以如果你不给构造函数传递任何参数,它就不会使用你在类中设置的默认值。
您可以尝试像这样设置默认值:

class TextInputComponent extends Component
{
    public $type;

    public function __construct($type = null)
    {
        $this->type = $type ?: 'text';
    }

    public function render()
    {
        return view('components.modules.Exchange.common.text-input');
    }
}

$this->type = $type ?: 'text';使用空合并运算符(?):)。如果$type的值不为null,则将其赋给$type属性。但是,如果$typenull,则它将'text'的默认值分配给$type属性。
这意味着,如果在Blade模板中包含TextInput组件时没有显式传递$type属性,则将自动使用默认值'text'
你可以对你不想显式传递值的其他变量尝试这样做。

相关问题