动态获取laravel中工作台包的公共路径

时间:2015-02-06 17:49:26

标签: laravel

我想根据包别名获取包公共目录(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,导入,合并;所以只有路径需要改变。

1 个答案:

答案 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');