你如何从 Laravel 的包中扩展视图?
Posted
技术标签:
【中文标题】你如何从 Laravel 的包中扩展视图?【英文标题】:How do you extend a view from a package in Laravel? 【发布时间】:2017-09-28 03:27:11 【问题描述】:所以我将这个包集成到我的应用程序中,https://github.com/thekordy/ticketit 并且这个包有自己的视图,我想修改 create.blade.php 之类的视图,.. 我该如何适当地做到这一点?
因为我目前的解决方案只是从包中复制视图更改返回视图('create');在我的控制器中?
【问题讨论】:
【参考方案1】:您会注意到许多软件包在其安装过程中包含此命令:
php artisan vendor:publish
它在幕后所做的是查找所有包的服务提供者指令,以找出任何应该“发布”的内容(意味着从供应商文件夹复制到 config/、views/ 等)
我查看了您的包裹的服务提供商: https://github.com/thekordy/ticketit/blob/0.2/src/TicketitServiceProvider.php 从第 179 行到第 182 行,包似乎有正确的“发布”说明。
这意味着文档可能跳过了这部分。
所以,您基本上应该点击命令 php artisan vendor:publish,它会将视图、翻译、公共和迁移文件夹复制到您自己的应用程序文件夹中。
然后您将在您的资源/视图中看到一个供应商文件夹,其中现在将包含ticketit 视图。
当你说“view('ticketit.form.index')”时,Laravel 会找到它,它会首先在你自己的资源文件夹中查找,如果找不到内容,它会尝试在包的内部查找文件夹。
有关更多信息,请阅读文档:https://laravel.com/docs/5.4/packages#views
【讨论】:
意思是如果包没有正确的发布说明,扩展视图的唯一方法是复制和粘贴它? 我想这会奏效。或者也许做一个公关和编辑图书馆?! :p【参考方案2】:再补充一件事,你可以通过发布命令的标签来选择要发布的资源类型
php artisan vendor:publish --provider="Kordy\Ticketit\TicketitServiceProvider" --tag="views"
仅发布票务视图(目标:base_path/resources/views/vendor/ticketit
)
如果出于任何原因,发现扩展视图还不够,并且想要扩展功能或控制器本身,ticketit allows using of custom routes file,您可以使用它来指向您自己的自定义控制器。
其他支持的供应商发布标签:
php artisan vendor:publish --provider="Kordy\Ticketit\TicketitServiceProvider" --tag="lang"
只发布ticketit翻译文件(目标:base_path/resources/lang/vendor/ticketit
)
php artisan vendor:publish --provider="Kordy\Ticketit\TicketitServiceProvider" --tag="db"
仅发布 ticketit 迁移文件(目标:base_path/database/migrations
)
php artisan vendor:publish --provider="Kordy\Ticketit\TicketitServiceProvider" --tag="public"
仅发布ticketit web 资源(js、css、..)文件(目标:public_path/vendor/ticketit
)
【讨论】:
【参考方案3】:对于遇到此问题的任何人,解决方案是 Laravel 默认约定,如文档中所示:https://laravel.com/docs/5.4/packages#views(发布视图主题)
简而言之,你需要使用资源路径为:
'__DIR__.'/path/to/views' => resource_path('views/vendor/view_namespace)'
其中 view_namespace 是 loadViewsFrom
方法中的第二个参数。
所以给定文件:https://github.com/thekordy/ticketit/blob/0.2/src/TicketitServiceProvider.php
如果第 102 行是 $this->loadViewsFrom($viewsDirectory, 'ticketit');
第 103 行应该是:
$this->publishes([$viewsDirectory => base_path('views/vendor/ticketit')], 'views');
【讨论】:
以上是关于你如何从 Laravel 的包中扩展视图?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Laravel 外部的包中使用 Laravel 外观(缓存、日志、存储)
如何使用 laravel 6 在我的包中使用 auth 进行自定义防护?
你如何扩展像Android.widget包中的DatePicker PagerAdapter这样的Android类?