这不是门面模式的工作方式。需要创建一个自定义门面来扩展`Illuminate\Support\Facades\Facade`,这基本上只需要自定义门面实现`protected static function getFacadeAccessor()`方法。此方法应返回门面所需解析的名称(或类或接口)。
门面允许您以静态方式调用实例方法(即非静态方法)。这是因为门面知道如何将对静态方法的调用重定向到门面背后的实例。这是通过实现`__callStatic($method, $args)`完成的,该方法简单地将静态方法调用重定向到由`getFacadeAccessor()`返回名称的实现。
假设您在服务容器中注册了名为“helper”的服务。您可以使用`app('helper')->getColor()`或`app()->make('helper')->getColor()`执行其上的`getColor()`方法。
使用名为`Helper`的门面并从`getFacadeAccessor()`方法中返回它的字符串形式来解析您的`helper`,然后可以使用`Helper::getColor()`执行相同操作。
对于您的情况,现在有几个选项:
1) 使用具有静态方法的类:
与您已经完成的类似,您可以定义具有静态方法的类。然后,通过使用完全限定的类名(FQCN)在您的 blade 视图中静态调用这些方法:
class Helper
{
public static function getColor(): string
{
return 'blue';
}
}
<div style="color:{{ \App\Helpers\Helper::getColor() }}"> ... </div>
2) 使用非静态类与门面模式:
您可以使用与上述相似的非静态方法类,并为其添加门面模式:
class Helper
{
public function getColor(): string
{
return 'blue';
}
}
class Helper extends \Illuminate\Support\Facades\Facade
{
protected static function getFacadeAccessor()
{
return \App\Helpers\Helper::class;
}
}
[
'Helper' => \App\Facades\Helper::class,
]
<div style="color:{{ \Helper::getColor() }}"> ... </div>
3)使用全局非类帮助文件:
您还可以定义一个基本的PHP文件,其中包含一些辅助函数,这些函数被全局注册。这些函数不是类方法,因此不需要使用类前缀来调用:
if (!function_exists('get_color')) {
function get_color()
{
return 'blue';
}
}
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;
}
}
}
}
[
\App\Providers\HelperServiceProvider::class,
]
<div style="color:{{ get_color() }}"> ... </div>
4)使用类和服务注入:
还有一个不错的选择是使用服务容器将服务注入到 Blade 模板中。 Laravel 提供了一个名为 @inject($var, $fqdn)
的 Blade 指令来实现它。
class Helper
{
public static function getColor(): string
{
return 'blue';
}
}
@inject('helper', \App\Helpers\Helper::class)
<div style="color:{{ $helper->getColor() }}"> ... </div>
我希望代码本身说明问题。文件的命名空间是有意省略的,当然你应该根据目录使用命名空间(符合 PSR-4)。
如果您不需要任何依赖项,并且基本上只需要静态访问某些内容,则我个人更喜欢全局助手函数(选项3)。
composer dump-autoload
- dparolicomposer dump-autoload
,但没有结果。 - user3573738