我深深地钟爱使用 Laravel 进行开发。笔记四
“我深深地钟爱使用 Laravel 进行开发。除了它能迅速构建应用、程序代码简洁且优雅之外,Laravel 框架本身亦是一个极具价值的学习范本。在本文中,我尝试将 Laravel 的官方文档要点整理成问答(Q&A)的形式,并力求每个概念都达到原子化的精细程度。尽管这种呈现方式可能并不适合所有读者,但倘若它能对你的学习或工作有所帮助,我将会倍感欣慰。”
下面的 Laravel Blade 示例代码的意思是?
- 例子:
- 答:当
$attributes->merge()
的对象不是类时,会被视为默认值,如果在引用的页面又定义了一次,那会以引用页面的主控,跟合并类不同,两者并不能共存但可以使用$attributes->prepends()
使两者共存,上面的示例中,'data-controller'
的默认值为'profile-controller'
,然后任何在引用页面定义的值都会被合并到这个数组中
# 过滤属性
下面的 Laravel Blade 示例代码的意思是?
- 例子:
{{ $attributes->filter(fn ($value, $key) => $key == ‘foo’) }}
- 答案:在 Blade 组件视图中使用 $attributes->filter(),唯有闭包 return true 的属性才会被保留
下面的 Laravel Blade 示例代码的意思是?
- 例子:
{{ $attributes->whereStartsWith(‘wire:model’) }}
- 答案:获取$attributes中,key为
'wire:model'
起始的属性
下面的 Laravel Blade 示例代码的意思是?
- 例子:
{{ $attributes->whereStartsWith(‘wire:model’)->first() }}
- 答:取得
whereStartsWith()
筛选后的第一笔属性
# 插槽
下面的 Laravel 示例代码的意思是?
- 例子:
// 组件视图页面
{{ $title }}
// 引用页面
服务器错误
糟糕! 出了点问题!
</x-警报>
- 答:在组件视图页面中可以定义 $slot 位置,当引用该组件时,在该组件标签内的内容都会渲染到组件视图页面中 $slot 的位置,如果想要在组件视图页面中定义多个 $slot 位置那么,如上例可以直接定义变量,在引用的页面中使用
<x-slot name="yourSlot"
# 作用域插槽
下面的 Laravel Blade 示例代码的意思是?
- 例子:
{{ $component->formatAlert('服务器错误') }}
糟糕! 出了问题!
</x-警报>
- 答案:可以在 Blade 组件类中定义方法,在 slot 中使用 $component 调用定义好的方法
# 内联组件视图
以下位于 Component 类的 Laravel 示例代码的意思是?
- 例子:
<?php
public function render()
{
return <<<’blade’
{{ $slot }}
blade;
}
- 答案:当组件的范围比较小,可能不需要同时使用组件类以及组件视图页面,此时可以直接在组件类的 render() 返回标记
# 生成内联视图组件
以下 Laravel 示例命令的意思是?
- 例子:
php artisan make:组件警报–内联
- 回答:当组件的范围比较小,可能不需要同时使用组件类以及组件视图页面,此时可以直接在组件类的render()返回标记上面的命令可以直接创建一个返回内联视图的组件
# 匿名组件
Laravel Blade 中,何谓匿名组件?
直接在resources/views/components/
数据夹底下定义一个Blade视图,而不需要建立Component类
Laravel Blade 中,组件视图可以没有组件类而单独存在吗?
可以,又称为匿名组件
# 数据属性/属性
下面的 Laravel Blade 示例代码的意思是?
- 例子:
// 在组件视图页面
@props([‘type’ => ‘info’, ‘message’])
// 在引用页面
- 答:当使用匿名组件时,因为没有关联类,所以
@props()
直接使用在组件视图页面定义属性,效果同在关联类定义
# 动态组件
下面的 Laravel Blade 示例代码的意思是?
- 例子:
- 答:有时候你可能需要渲染一个组件,但是只有在运行时的时候才知道要渲染哪一个组件,这个时候就可以使用 Dynamic Component 从
:component
带入指定的组件
# 手动注册组件
下面的 Laravel Blade 示例代码的意思是?
- 例子:
<?php
使用 Illuminate\Support\Facades\Blade;
使用 VendorPackage\View\Components\AlertComponent;
公共函数 boot()
{
Blade::component(‘package-alert’, AlertComponent::class);
}
- 答:Laravel 默认会到
resources/views/components
以及app\Views\Components
资料夹内寻找并注册组件,但如果你在构建一个包,又或者你将组件放在其他位置的话,可以在包服务提供者内的 boot() 注册组件
# 自动加载包组件
下面的 Laravel Blade 示例代码的意思是?
- 例子:
<?php
// 在包服务提供者中
public function boot()
{
Blade::componentNamespace(‘Nightshade\Views\Components’, ‘nightshade’);
}
// 在引用的页面中
<x-nightshade::calendar />
<x-nightshade::color-picker />
- 答:在包服务提供者 boot() 中,注册一个名为
'nightshade'
Laravel 的命名空间默认会到resources/views/components
以及app\Views\Components
资料夹内查找并注册组件,但如果你在构建一个包,又或者你将组件放在其他位置的话,可以在包服务提供者内的 boot() 注册。
# 堆栈
下面的 Laravel Blade 示例代码的意思是?
- 例子:
<?php
@push(‘scripts’)
@endpush
- 答案:将指令中的脚本压入到名为
scripts
的堆栈
下面的 Laravel Blade 示例代码的意思是?
- 例子:
<?php
@stack(‘scripts’)
- 答案:将 stack
scripts
里面的内容 pop 出来
下面的 Laravel Blade 示例代码的意思是?
- 例子:
@push(‘scripts’)
这将是第二个…
@endpush
// 稍后…
@prepend(‘scripts’)
这将是第一个…
@endprepend
- 答:当使用@push时,script会依次执行,越先push的越先执行,但可以使用@prepend改变顺序,越后面@prepend的会越先执行
# 服务注入
下面的 Laravel 示例代码的意思是?
- 例子:
<?php
@inject(‘metrics’, ‘App\Services\MetricsService’)
- 答案:从 Laravel 服务容器获取服务 arg1 要将服务赋值给 的变量,arg 为 Service 的位置
# 延长刀片
下面的 Laravel Blade 示例代码的意思是?
- 例子:
<?php
命名空间 App\Providers;
使用 Illuminate\Support\Facades\Blade;
使用 Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
//
}
public function boot()
{
Blade::directive(‘datetime’, function ($expression) {
return “<?php echo ($expression)->format(‘ m/d/YH:i’);>”;
});
}
}
- 答:在AppServiceProvider的boot()中,可以使用Blade的directive()来注册客制化的Blade指令定义一个名为datetime的Blade指令,逻辑于定义闭包内
Laravel 中,如果我更新了 Blade 视图,需要清除缓存吗?
如果有跑php artisan view:cache
的话,要执行php artisan view:clear
清楚
# 自定义 If 语句
下面的 Laravel 示例代码的意思是?
- 例子:
<?php
// 位于AppServiceProvider
public function boot()
{
Blade::if(‘disk’, function ($value) {
return config(‘filesystems.default’) === $value;
});
}
// 引用页
@disk(‘local’)
@elsedisk(‘s3’)
@else
@enddisk
@unlessdisk(‘local’)
@enddisk
- 回答:
<?php
// 定义一个定制化的 Blade If 语句,逻辑定义于闭包内
public function boot()
{
Blade::if(‘disk’, function ($value) {
return config(‘filesystems.default’) === $值
});
}
// 位于引用页面
@disk(‘local’)
@elsedisk(‘s3’)
@else
@enddisk
thx for reading
@unlessdisk(‘local’)
@enddisk
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: