【问题标题】:How to use a vendor file (installed via Composer) in a Cake-PHP-View?如何在 Cake-PHP-View 中使用供应商文件(通过 Composer 安装)?
【发布时间】:2016-07-18 06:17:57
【问题描述】:

我在这里遇到了一个问题,我觉得有一个我还没有找到的简单而干净的解决方案...... 我的 Cake-PHP-Application 看起来像这样:

  • 项目文件夹
    • 应用程序
    • 供应商
    • composer.json

Cake-PHP 和我要使用的外部文件安装在供应商文件夹中。 在供应商中,我有一个用于 twitter bootstrap 的包,它有一个 css 和一个 js 文件,我想将其包含在我的视图中,但它无法访问,因为这些文件不会保留在我的 Cake 的 webroot 文件夹中-PHP 项目。 现在我的问题是 - 如何让这两个文件在我的 Cake-PHP 项目中可访问,而不将它们复制到 webroot 文件夹?使用符号链接对我来说有点像一个肮脏的黑客...... 必须有一个干净的解决方案,否则将 Cake-PHP 与 Composer 一起使用将毫无意义。 我的 composer.json 看起来像这样:

{
"name": "MyProject",
"version": "0.0.0",
"require": {
    "php": ">=5.5.11",
    "cakephp/cakephp": "2.6.3",
    "composer/installers": "*",
    "twbs/bootstrap": "3.3.4",
    "components/jquery": "2.1.3"
},
"extra" : {
  "installer-paths":{
      "plugins/{$name}":["type:cakephp-plugin"],
      "app/webroot/bootstrap":["twbs/bootstrap"]
  }
},
"config": {
    "vendor-dir": "vendors"
}

顺便说一句:composer 会忽略给定的引导安装路径,因为包没有类型...

【问题讨论】:

  • 恕我直言,将 composer 用于前端依赖项没有多大意义,您最好使用 bower 之类的东西。
  • 你可能是对的,但是因为我必须使用 Composer,所以我使用它并且安装 2 个 packagemanagers 对我来说似乎很奇怪......
  • 如果你问我没什么奇怪的,别忘了 composer 天生就是一个 PHP 依赖管理器,你总是会遇到非 PHP 包的问题,导致不得不使用自定义安装程序等。无论如何,请检查stackoverflow.com/q/25685722/1392379 (github.com/RobLoach/component-installer) 或stackoverflow.com/q/19118367/1392379
  • 我看到了你的方法,我不认为你在默认情况下是错误的,但是这个问题必须有一个具体的解决方案,因为 cake-php 自然支持作曲家。如果不是这样,那么整个 composer-cake-symbiosys 将毫无意义,除了只是用 composer 安装 cake 而已。我添加的每个包管理器,我都必须安装在服务器上,这对我来说很糟糕。 :)
  • 除了使用自定义作曲家安装程序(对于通用软件包或 shim 软件包 - 有什么理由不能使用此选项吗?)、复制/链接文件或制作之外,没有其他解决方案使用额外的依赖管理器,你可能不喜欢它,但它就是这样。

标签: twitter-bootstrap cakephp composer-php


【解决方案1】:

使用tws/bootstrap 将需要额外的步骤来安装这些资产。这通常通过符号链接或复制来完成。

例如,将 Bootstrap 添加到 Symfony2 时,您需要

 "require" : {
     "mopa/bootstrap-bundle": "dev-master",
     "twbs/bootstrap": "dev-master",
   },
    "scripts": {
        "post-install-cmd": [
            /* sensio commands **/
            "Mopa\\Bundle\\BootstrapBundle\\Composer\\ScriptHandler::postInstallSymlinkTwitterBootstrap"
        ],
        "post-update-cmd": [
            /* sensio commands **/
            "Mopa\\Bundle\\BootstrapBundle\\Composer\\ScriptHandler::postInstallSymlinkTwitterBootstrap"
        ]
    },

一个包是资产本身,其他包为资产提供集成和“postInstall”处理程序。

对于 Cake,您必须找到为 tws/boostrap 执行安装工作的包 - 也许 Cake 社区中就有这样的包。

但我建议使用更简单的方法,开箱即用:

{
    "require": {
        "slywalker/boost_cake": "*"
    }
}

然后使用 enable CakePlugin::load('BoostCake'); 并添加您需要的助手。

正如@ndm 指出的那样:您还可以决定使用 Composer 与其他资产管理器“架桥”(间接)。其中之一是https://github.com/francoispluchino/composer-asset-plugin

或者您可以直接与这些资产管理器合作,例如 bower、npm。

【讨论】:

  • Cake 本身没有办法吗?
【解决方案2】:

在您的composer.json 中,使用scripts 数组。

至少对于 CakePHP 3.0,这是预先构建的,如下所示:

"scripts": {
    "post-install-cmd": "App\\Console\\Installer::postInstall",
    "post-autoload-dump": "Cake\\Composer\\Installer\\PluginInstaller::postAutoloadDump"
},

post-install-cmd 脚本从/src/Console/Installer.php 调用postInstall 函数。

如果您查看该功能,您会发现它在安装后做了一些事情,例如设置文件权限。

在这里,您可以执行您需要的任何其他操作,例如使用标准 PHP 函数,例如 copyrename(到移动)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-25
    • 2019-12-25
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多