你如何从 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类?

如何从 Windows 命令提示符在 Laravel 中运行 PHPUnit

Symfony 3.4 在我的包中使用视图