组件方法错误 - Laravel 9 中的未定义变量

Component Methods error - Undefined variable in Laravel 9

我正在 Laravel 9 中创建一个 复选框组件 并尝试从组件访问 isChecked 方法class如下:

// app\View\Components\form-checkbox.php
namespace App\View\Components;
use Illuminate\View\Component;

class formcheckbox extends Component
{
    public $name;
    public $value;
    public $actualValue;

    /**
     * Create a new component instance.
     * @return void
     */
    public function __construct($name, $value, $actualValue)
    {
        //
        $this->name = $name;
        $this->value = $value;
        $this->actualValue = $actualValue;
    }

    public function isChecked($option)
    {
        return $option === $this->actualValue;
    }

    /**
     * Get the view / contents that represent the component.
     * @return \Illuminate\Contracts\View\View|\Closure|string
     */
    public function render()
    {
        return view('components.form-checkbox');
    }
}
<!-- resources\views\components\form-checkbox.blade.php -->
<div class="checkbox">
    <label>
        <input
            type="checkbox"
            name="{{ $name }}"
            value="{{ $value }}"
            actualValue={{ $actualValue }}
            {{ $isSelected($value) ? 'checked="checked"' : '' }}>
        {{ $slot }}
    </label>
</div>

当我尝试渲染组件时:

<?php $val = 'Y'; ?>
<x-form-checkbox name="testChkBx[]" value="Y" actualValue="{{ $val }}"> Y </x-form-checkbox>
<x-form-checkbox name="testChkBx[]" value="YY" actualValue="{{ $val }}"> YY </x-form-checkbox>

给出错误:

Undefined variable $isSelected.

我发现了一个类似的问题,但找不到如何调用 isSelected 方法。我正在尝试使用全新 Laravel 安装。

错误和修复

您的代码中有两个问题:

  1. class 姓名。
  2. 方法名称。

PHP classes naming rules

A valid class name starts with a letter or underscore, followed by any number of letters, numbers, or underscores.

Component Methods Docs

In addition to public variables being available to your component template, any public methods on the component may be invoked...

Class 姓名

由于违反了命名规则和约定,目前您的组件被视为匿名组件。每次调用仅存在于 class 范围内的属性或方法都将引发 Undefined 错误。

除了 PHP 命名规则外,Laravel 声明 组件 class 以 UpperCamelCase 视图命名在 kebab-case

中命名

因此,只需使用名称为 class 的 artisan 重新创建您的组件即可。

php artisan make:component FormCheckbox
// app\View\Components\FormCheckbox.php
class FormCheckbox extends Component
{
    public $name;
    public $value;
    public $actualValue;

    public function __construct($name, $value, $actualValue)
    {
        $this->name = $name;
        $this->value = $value;
        $this->actualValue = $actualValue;
    }

    public function isChecked($option): bool
    {
        return $option === $this->actualValue;
    }

    public function render()
    {
        return view('components.form-checkbox');
    }
}

请注意,您的文本编辑器让您失望了,没有指出语法错误!

方法名称

因为您已经定义了一个 isChecked 方法,所以您必须调用那个确切的方法。因为 isSelected 不是任何组件都可用的内置方法,所以它只是文档的一个示例。

<!-- resources\views\components\form-checkbox.blade.php -->
<div>
    <label>
        <input type="checkbox" name="{{ $name }}" value="{{ $value }}" actualValue={{ $actualValue }}
            {{ $isChecked($value) ? 'checked="checked"' : '' }}> {{ $slot }}
    </label>
</div>

您可能需要 运行 :

composer dump
php artisan optimize:clear

额外

您可以通过这些方式定义 isChecked 方法来清理您的 Blade 代码:

<div class="checkbox">
    <label>
        <input type="checkbox" name="{{ $name }}" value="{{ $value }}" actualValue={{ $actualValue }}
            {{ $isChecked($value) }}> {{ $slot }}
    </label>
</div>

1

    public function isChecked($option): void
    {
        if ($option === $this->actualValue)
            echo 'checked="checked"';
    }

2

    public function isChecked($option): string
    {
        return $option === $this->actualValue ? 'checked="checked"' : '';
    }