gpt4 book ai didi

laravel - 如何使用 Blade 模板中的类?

转载 作者:行者123 更新时间:2023-12-04 11:37:44 24 4
gpt4 key购买 nike

我创建了类(class) Helper带路径 App\Http\Helpers\ :

<?php

namespace App\Http\Helpers;

class Helper
{
public static function applyClass($user) {
return "new";
}

}

然后我在 app.php注册了它在第 aliases 节:
'Helper' =>   App\Http\Helpers\Helper::class

当我尝试从 Blade 调用静态方法时:
<tr class="{{ \Helper::applyClass($user) }}">
<tr class="{{ Helper::applyClass($user) }}">

我收到一个错误:
Class 'Helper' not found

最佳答案

这不是门面的工作方式。扩展 Illuminate\Support\Facades\Facade 需要自定义外观,基本上只需要自定义外观来实现 protected static function getFacadeAccessor() .此方法应返回应该由外观解析的名称(或类或接口(interface))。
外观允许您以静态方式调用实例方法(即非 static 方法)。这是有效的,因为门面知道如何将对静态方法的调用重定向到门面后面的实例。这是通过实现 __callStatic($method, $args) 来完成的。 ,它只是将静态方法调用重定向到名称由 getFacadeAccessor() 返回的实现。 .
假设您有一个以 helper 为名注册的服务。在服务容器中。然后你可以执行一个方法 getColor()在它上面使用 app('helper')->getColor()app()->make('helper')->getColor() .
有一个叫 Helper 的门面这解决了您的 helper通过将其作为来自 getFacadeAccessor() 的字符串返回方法,然后您可以使用 Helper::getColor() 执行相同的操作.

就您而言,您现在有几个选择:
1) 使用带有静态方法的类:
与您已经做过的类似,您可以使用静态方法定义一个类。然后,您可以使用完全限定的类名 (FQCN) 从 Blade View 静态调用这些方法:

// app/Helpers/Helper.php
class Helper
{
public static function getColor(): string
{
return 'blue';
}
}

// resources/views/some/page.blade.php
<div style="color:{{ \App\Helpers\Helper::getColor() }}"> ... </div>
2) 使用带有外观的非静态类:
您可以将与上述类似的类与非静态方法一起使用,并为其添加外观:
// app/Helpers/Helper.php
class Helper
{
public function getColor(): string
{
return 'blue';
}
}

// app/Facades/Helper.php
class Helper extends \Illuminate\Support\Facades\Facade
{
public function getFacadeAccessor()
{
return \App\Helpers\Helper::class;
}
}

// config/app.php -> 'aliases' array
[
// ... other facades ...
'Helper' => \App\Facades\Helper::class,
]

// resources/views/some/page.blade.php
<div style="color:{{ \Helper::getColor() }}"> ... </div>
3) 使用全局非类帮助文件:
您还可以定义一个基本的 PHP 文件,其中包含一些全局注册的辅助函数。这些函数不是类方法,因此不需要使用类前缀调用:
// app/Helpers/color_utils.php
if (!function_exists('get_color')) {
function get_color()
{
return 'blue';
}
}

// app/Providers/HelperServiceProvider.php
class HelperServiceProvider extends \Illuminate\Support\ServiceProvider
{
public function register(): void
{
$filenames = glob(app_path('Helpers/*.php'));

if ($filenames !== false && is_iterable($filenames)) {
foreach ($filenames as $filename) {
require_once $filename;
}
}
}
}

// config/app.php -> 'providers' array
[
// ... other providers ...
\App\Providers\HelperServiceProvider::class,
]

// resources/views/some/page.blade.php
<div style="color:{{ get_color() }}"> ... </div>
4) 使用类和服务注入(inject):
还有一个不错的选择是使用服务容器将服务注入(inject)到 Blade 模板中。 Laravel 提供了一个名为 @inject($var, $fqdn) 的 Blade 指令。为了它。
// app/Helpers/Helper.php
class Helper
{
public static function getColor(): string
{
return 'blue';
}
}

// resources/views/some/page.blade.php
@inject('helper', \App\Helpers\Helper::class)

<div style="color:{{ $helper->getColor() }}"> ... </div>
我希望代码不言自明。故意省略文件的命名空间,当然您应该根据目录使用命名空间(符合 PSR-4)。
如果您不需要任何依赖项并且基本上只需要静态访问某些东西,我个人更喜欢全局助手(选项 3)。

关于laravel - 如何使用 Blade 模板中的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57560226/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com