在Laravel项目中,我采用以下方式进行此类操作(虽然我没有使用Livewire,但我认为这同样适用于你的情况)。首先,创建一个服务提供者,如果你还没有为你的网站或应用创建的话:
php artisan make:provider SiteServiceProvider
然后在config/app.php
中注册该服务提供者:
'providers' => [
// 其他服务提供者
App\Providers\SiteServiceProvider::class,
],
在你的SiteServiceProvider
的boot
方法中,你可以定义全局函数(在所有视图中均可访问):
use Illuminate\Support\Facades\View;
public function boot()
{
View::share('formatPhoneNumber', function ($phoneNumber) {
// 确保$phoneNumber是一个10位数字
$phoneNumber = preg_replace('/[^0-9]/', '', $phoneNumber);
// 格式化电话号码
return sprintf("(%s) %s - %s",
substr($phoneNumber, 0, 3),
substr($phoneNumber, 3, 3),
substr($phoneNumber, 6)
);
});
}
然后在视图中像这样使用这个函数:
<a class="stretched-link" href="tel:{{ $phoneNumber }}">📞 {{ $formatPhoneNumber($phoneNumber) }}</a>
你也可以创建全局变量。在同一服务提供者的boot
方法中,可以这样做:
View::composer('*', function ($view) use ($config) {
$view->with('phoneNumber', $config['phoneNumber']);
$view->with('emailAddress', $config['emailAddress']);
// 根据需要添加更多变量
});
然后在视图中这样使用:
<a class="stretched-link" href="tel:{{ $phoneNumber }}">📞 {{ $formatPhoneNumber($phoneNumber) }}</a>
在我完成大部分答案后,我才意识到这并不是你要实现的功能,你想要的是不论当前呈现哪个视图,都能通过菜单从站点的任何地方调用一个函数。尽管如此,既然我已经写出这个答案,也许这对其他人会有所帮助...
一种可能的方法是将你希望全局化的函数放入一个trait中,然后在所有视图组件类中使用这个trait。