我想根据包别名获取包公共目录(css等)的路径。
laravel框架中是否已经内置了什么?
换句话说:
public_path('myalias');
当我谈论别名时,你通常会"别名"通过在服务提供商的引导方法中添加以下内容的模块:
$this->package('namespace/package','alias_name');
对于那些想知道为什么有人想要这样做的人:
我们正在运行一个多域/子域应用程序,它使用所有域的中央代码片段,然后是每个域的特定包(我将它们称为漏斗)。
每个漏斗都有自己的控制器,可以扩展基本控制器以实现自己的功能,同时尽可能地重用代码。他们也有自己的看法。
漏斗通过以下方式引用自己的观点: 视图::使('漏斗:: path.to.view&#39)
我们实现这一目标的方法是在页面加载时执行一些业务逻辑,以仅加载与该特定域相关的FunnelServiceProvider,并将其别名化为" funnel"。这样我们的基本控制器也可以引用漏斗,而不是绑定到特定的包视图,包含,块等。
我希望在视图上做类似的事情,这样我就可以简单地调用类似get_funnel_path()来获取当前正在加载的漏斗的路径。
然后可以使用该值加载css,js,图像等,而无需担心漏斗路径。
这样我们就可以简单地将视图从一个域复制并粘贴到下一个域,而无需修改可能多个文件中的所有路径。我们还可以在所有/大多数视图中使用全局包含的文件。
这可能是一个例子。对于99%的文件,head部分应该相同,但是加载其资源的路径应该根据漏斗进行更改。
我们对css文件使用相同的命名约定,并为所有漏斗使用sass,导入,合并;所以只有路径需要改变。
答案 0 :(得分:1)
你可以做类似的事情,虽然它只适用于你自己的包,需要一些工作。因为别名实际上没有存储在你可以轻松访问的地方,你必须自己做。
首先创建一些类来存储你的包名。我称之为PackageManager
:
class PackageManager {
private $packages = array();
public function addPackage($fullName, $alias){
$this->packages[$alias] = $fullName;
return $this;
}
public function getPublicPath($alias){
if(!isset($this->packages[$alias])) return public_path();
$path = 'packages/' . $this->packages[$alias];
return public_path($path);
}
}
现在让我们将该类注册为服务提供商中的单身人士:
$this->app->singleton('packagemanager', function(){
return new PackageManager();
});
然后,在您要注册的每个包中,在$this->package()
旁边的引导方法中添加此调用:
$this->app['packagemanager']->addPackage('vendor/package', 'alias');
之后,您可以在应用程序的任何位置执行此操作:
app('packagemanager')->getPublicPath('alias');
如果您想要更短的语法,请在某处添加此辅助函数:
function public_package_path($alias){
return app('packagemanager')->getPublicPath($alias);
}
只是这样做:
public_package_path('alias');