democracyapps / domain-context
实用工具,便于将路由层次结构的一部分映射到单独的域名
Requires
- php: >=5.4.0
- illuminate/support: ~5.0
Requires (Dev)
- phpunit/phpunit: ~4.0
This package is not auto-updated.
Last update: 2024-09-28 17:23:03 UTC
README
这是一个简单的Laravel实用工具,便于将路由层次结构的一部分映射到单独的域名。
例如,假设贵公司有一个名为coolmarketplace.com的网站,该网站允许其他公司注册以列出他们的产品。除了您提供的任何用于突出显示有趣或流行的产品的页面外,每个公司都有自己的页面,由他们选择的短代码标识。例如,Golly Gee Widgets的页面为http://coolmarketplace.com/golly。
然而,他们还希望这个迷你网站出现在他们自己的域名下,例如http://market.gollygee.com,可能具有不同的样式、链接等。您将需要根据是作为coolmarketplace.com/golly还是market.gollygee.com访问,对同一个迷你网站进行不同的应用逻辑或展示。
该实用工具创建了一个单例DomainContext对象,可用于测试当前请求是否通过应该与默认设置不同的域名传入,并获取与该域名关联的内部对象的标识符。
使用说明
安装
首先通过Composer安装此包。
{ "require": { "democracyapps/domain-context": "dev-master" } }
将服务提供者添加到app.php
// app/config/app.php 'providers' => [ '...', 'DemocracyApps\DomainContext\DomainContextServiceProvider', ];
为了方便,您还可以将外观添加到app.php
'aliases' => [ '...', 'DomainContext' => 'DemocracyApps\DomainContext\DomainContextFacade', ];
配置参数
接下来,运行以下命令发布配置文件
php artisan vendor:publish
并编辑'config/domain-context.php'。该软件包中目前使用了四个配置设置。
mapped_domain_storage (默认: 'config')
您可以在配置文件或数据库表中指定要映射的域名。此参数确定使用哪个。默认情况下,映射的域名简单地添加到配置文件本身(请参阅mapped_domains参数)。如果mapped_domain_storage设置为'database',则将查找由mapped_domain_table_name参数指定的表。
mapped_domains (默认: 空数组)
如果mapped_domain_storage设置为'config',则此数组提供了正在映射的域名及其关联标识符的列表。标识符可以是任何类型。以下示例中,http://market.gollygee.com是一个映射的域名,并在内部与短代码'golly'关联。更常见的使用可能是将其与数据库模型ID关联,如第二行所示。
'mapped_domains' => [ 'market.gollygee.com' => 'golly', 'stdexample.com' => 133 ]
mapped_domain_table_name (默认: 'mapped_domains')
如果mapped_domain_storage设置为'database',则将在由该参数指定的表中搜索映射域的信息。它期望表具有'domain_name'列和'identifier'列。它不对这些列执行任何操作 - 在请求时简单地返回它们(如下所示),并将当前域与表条目的匹配解释为表示该域已映射。
view_variable_name (默认: 'domainContext')
DomainContext对象自动通过默认的$domainContext变量对所有Laravel视图可用。可以使用此参数指定不同的变量名。
如何使用
让我们以本readme顶部的示例为例。
在实际中,您会在响应传入域名时实现逻辑或展示的变体,常见的地方有三个:routes.php 文件、控制器和视图。逻辑当然是您自己的。您只需要一个简单的方法来判断您是否在已映射的域名中,如果是,相关的客户端对象应该是什么。
通过三个方法,DomainContext 对象提供了这种功能:DomainContext::isMapped()、DomainContext::getDomain() 和 DomainContext::getDomainIdentifier()(当然,您也可以通过 app()->make 来获取对象)。
第一个是一个布尔值,表示当前域名是否已经映射。第二个告诉您域的名称(在上面的示例中,它将返回 'market.gollygee.com')。最后一个返回要使用的标识符,例如从表中加载客户端信息(如第一个示例中的 'golly')。
要在路由文件中使用它们,最简单的方法是使用外观。例如
if (\DomainContext::isMapped()) { require app_path().'/Http/Routes/mapped.php'; // all the routes associated with mapped domains } else { require app_path().'/Http/Routes/market.php'; // all the routes associated with the platform }
当然,外观也可以在控制器或其他任何地方使用,但您也可以简单地将 DomainContext 对象注入到控制器方法中,例如
public function show($id, DomainContext $context) { $short = $context->getDomainIdentifier(); $tc = Company::where('short_name', '=', $short)->first(); ...
最后,在视图中,DomainContext 总是可用作为 $domainContext(或者在配置文件中设置的变量名)。例如,您可能有一部分菜单取决于域名是否已映射
<li class="dropdown"> @if ($domainContext->isMapped()) <a href="/products" class="dropdown-toggle" >All Products</a> @else <a href="#" class="dropdown-toggle" data-toggle="dropdown">Market</a> <ul class="dropdown-menu"> <li><a href="/market/products">Products</a></li> <li><a href="/market/companies">Companies</a></li> </ul> @endif </li>
问题和计划
此模块正在用于几个正在积极开发的产品,并可能有所发展。如果您发现错误或对功能有请求,请在此处创建问题,在推特上找到我(@ejaxon)或提交一个拉取请求。