我在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-autoload、php artisan view:clear、php artisan cache:clear、php 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>
2条答案
按热度按时间b09cbbtk1#
经过大量的搜索和实验,我找到了解决方案。
我在做
对吧?
我需要将组件路径中的每个单词大写,就像下面这样:x-Modules.Exchange.Common
然后沿着这个路径大写文件夹名称,它立即工作。
所以我假设Laravel大写基于类的组件路径,并试图找到它们,然后操作系统开始发挥作用,如果它是大小写不敏感的,它会找到组件类,而不是(在Linux的情况下)你必须大写你的文件夹名称,让操作系统找到它。
jc3wubiy2#
感谢您提供额外的代码片段。以下是我的最新回应。
在Laravel的Blade模板中,当使用组件时,组件的属性需要在包含组件时被***显式传递***。如果没有显式传递相应的属性,则不会自动使用组件类本身中设置的默认值。
构造函数负责根据组件包含期间传递的值初始化属性。所以如果你不给构造函数传递任何参数,它就不会使用你在类中设置的默认值。
您可以尝试像这样设置默认值:
行
$this->type = $type ?: 'text';
使用空合并运算符(?):)。如果$type的值不为null,则将其赋给$type属性。但是,如果$type
是null
,则它将'text'
的默认值分配给$type
属性。这意味着,如果在Blade模板中包含
TextInput
组件时没有显式传递$type属性,则将自动使用默认值'text'
。你可以对你不想显式传递值的其他变量尝试这样做。