如何列出Rails 3中的所有自动加载路径?
在Rails控制台中,当我这样做时,它只列出添加到配置的自定义路径:
$ rails c
Loading development environment (Rails 3.2.9)
1.9.3p194 :001 > MyRailsApp::Application.config.autoload_paths
=> []
Run Code Online (Sandbox Code Playgroud) 我想使用composer脚本进行一些安装后的操作,例如将文件从bootstrap vendor文件夹复制到我的Web应用程序公用文件夹.我有PHP世界和Web应用程序开发的宝贝经验.
这是我的目录结构*

这是我的composer.json
{
"name": "Composer Script",
"description": "An example to demonstrate the use of Composer scripts",
"version": "1.0.0",
"require": {
"twitter/bootstrap": ">=3.0"
},
"scripts": {
"post-install-cmd": [
"ComposerScript\\Installer::postInstall"
],
"post-package-install": [
"/var/www/test/composer-script/install.sh"
]
}
}
Run Code Online (Sandbox Code Playgroud)
这是ComposerScript\Installer.php
class Installer
{
public static function postInstall(Event $event)
{
$composer = $event->getComposer();
// do stuff
}
public static function postPackageInstall(Event $event)
{
$installedPackage = $event->getOperation()->getPackage();
// do stuff
}
public static function warmCache(Event $event)
{
// …Run Code Online (Sandbox Code Playgroud) 我正在慢慢地从 PHP 过渡到 Node.js,并试图找到类似于composer dumpautoload. 多亏了PSR-4,当use在每个文件的开头使用带有简单语句的命令时,可以很容易地访问 PHP 中任何文件中的任何类。
npm似乎在管理包和依赖项方面做得很好,但是在您自己的项目中具有相同的灵活性将避免创建require在文件更改路径时很容易中断的语句。
我要查找的示例 - 同一文件夹中的 2 个文件:
一些 testClass.js(类文件)
var testClass = {
sayHello: function () {
console.log('this is a test');
}
};
module.exports = testClass ;
Run Code Online (Sandbox Code Playgroud)
通常这是您将放在另一个文件 index.js 文件中的内容:
var testClass = require('./testClass');
testClass.sayHello();
Run Code Online (Sandbox Code Playgroud)
但是想象一下,您可以使用一些应用程序或命令(例如 PHPcomposer dumpautoload并简单地运行以下命令)为所有类预先编制索引:
var testClass = require('testClass');
testClass.sayHello();
Run Code Online (Sandbox Code Playgroud)
我找不到任何似乎可以实现这一目标的解决方案。
我错过了什么?
我有一个使用spl_autoload_register()以下注册的自动加载器:
class MyAutoLoader{
public function __construct(){
spl_autoload_register(array($this, 'loader'));
}
public function loader($className){
var_dump($className);
}
}
$al = new MyAutoLoader(); //Register the autoloader
Run Code Online (Sandbox Code Playgroud)
从var_dump(),自动加载器似乎被调用很多东西,数据要插入到数据库中,参数化的SQL查询以及不是:
string 'name' (length=4)
string 'a:2:{s:5:"label";s:4:"Name";s:8:"required";b:1;}' (length=48)
string 'en_US' (length=5)
string 'object' (length=6)
string 'name = ?' (length=8)
Run Code Online (Sandbox Code Playgroud)
这些东西永远不会是类,所以永远不应该使用new或class_exists()等等.
在什么情况下/函数调用是自动加载器调用?我想停止自动加载不是被调用类的"classNames",因为每个$className都被使用检查file_exist(),并且检查这些数据字符串是非常低效的.
问题解决了.我首先按照Brad的建议进行了回溯,并将跟踪转储到文件中(只需添加一个打开文件并附加到其上的小片段).
显然,痕迹非常大,但我选择了我能找到的最简单的一条.顺便说一下,这个跟踪碰巧是一个调用我编写的数据库(ORM)包装器来包装真棒RedBean ORM库的.我转储的结果$className也验证了,因为这些字符串是数据进出数据库.
话虽如此,我有一个__call()拦截我的数据库包装器的方法,做一些处理,将它传递给RedBean,处理结果,然后将其发送回调用者.
问题:在处理过程中,我正在调用is_subclass_of()和instanceof,这显然会要求自动加载器尝试加载类(因为我们没有任何名为name =?loaded的类,也不存在).
解决方案是实际确保我们有一个object之前的呼叫is_subclass_of()和instanceof: …
我正在使用Composer进行模块依赖管理(喜欢使用autoload.php而不是大量的包含和需要!).
我想在存储凭据的情况下包含一个位于根Composer目录之外的PHP文件(用于安全性)defines().
这不起作用,composer.json:
{
"autoload": {
"classmap": ["../credentials.php"]
}
}
Run Code Online (Sandbox Code Playgroud)
credentials.php:
define('RYAN','BRODIE');
Run Code Online (Sandbox Code Playgroud)
test.php:
require_once __DIR__.'/../vendor/autoload.php';
echo RYAN;
Run Code Online (Sandbox Code Playgroud)
结果Notice: Use of undefined constant RYAN.如果Composer的自动加载器仅用于Class包含,那么我会感激任何黑客(因为它)使这项工作.
标题说明了自己.所以这是我的项目结构:
|src
|Database
|Core
|MySQL.php
|Support
start.php
|vendor
composer.json
index.php
Run Code Online (Sandbox Code Playgroud)
MySQL.php文件:
<?php
namespace Database\Core;
//Some methods here
Run Code Online (Sandbox Code Playgroud)
index.php和start.php文件:
//start.php file
<?php
require __DIR__ . '/../vendor/autoload.php';
?>
//index.php file
<?php
use Database\Core;
require __DIR__ . '/src/start.php';
$mysql = new MySQL(); // Gets exception Class 'MySQL' cannot found etc.
?>
Run Code Online (Sandbox Code Playgroud)
最后我的composer.json自动加载部分:
"autoload": {
"psr-4": "Database\\": "src/" // Also tried "src/Database" too
}
Run Code Online (Sandbox Code Playgroud)
问题出在哪儿?我真的厌倦了试图应对这种情况.请帮帮我们!谢谢.
根据PHP页面上的最高评论spl_autoload_register( ):
对于具有命名空间类的PHP 5.3用户来说是个好消息:
当您创建与包含类的名称空间匹配的子文件夹结构时,您甚至不必定义自动加载器.
<?php
spl_autoload_extensions(".php"); // comma-separated list
spl_autoload_register();
?>
Run Code Online (Sandbox Code Playgroud)
但是,当我有以下结构时:
* classes/someclass.php
* index.php
其中someclass.php包含以下内容:
<?php
class someclass {
function __construct( ) {
echo 'It works!';
}
}
?>
Run Code Online (Sandbox Code Playgroud)
并index.php包含:
<?php
spl_autoload_extensions(".php");
spl_autoload_register();
new classes\someclass;
?>
Run Code Online (Sandbox Code Playgroud)
然后我收到以下错误:
致命错误:spl_autoload():无法加载类classes\someclass
我弄错了吗?我怎样才能做到这一点?
从评论
这对于班级不起作用:
<?php
namespace classes;
class someclass {
function __construct( ) {
echo 'It works!';
}
}
?>
Run Code Online (Sandbox Code Playgroud) 这段代码:
<?php
namespace designblob;
function autoloader($class){
include "wrappers/databaseWrapper.php";
}
spl_autoload_register('autoloader');
?>
Run Code Online (Sandbox Code Playgroud)
抛出此错误:
致命错误:在/var/www/xxx/library/autoloader.php:8中找不到未找到错误'LogicException'且找不到消息'Function'autooloader'(找不到函数'autoloader'或函数名称无效)'堆栈跟踪:#0 /var/www/xxx/library/autoloader.php(8):spl_autoload_register('autoloader')#1 /var/www/xxx/library/debug.php(19):require_once('/ var/www/xxx. ..')#8 {main}在第8行的/var/www/xxxm/library/autoloader.php中引发
为什么不起作用?
我正在使用symfony 2.3框架,自动加载器声称已找到该文件,但没有类:
RuntimeException: The autoloader expected class "Sensio\Bundle\
FrameworkExtraBundle\Request\ParamConverter\DateTimeParamConverter"
to be defined in file "/home/na/auth/vendor/sensio/framework-extra-bundle/
Sensio/Bundle/FrameworkExtraBundle/Request/ParamConverter/
DateTimeParamConverter.php". The file was found but the class was not in it,
the class name or namespace probably has a typo.
Run Code Online (Sandbox Code Playgroud)
这个引用的文件如下所示:
<?php
/*
* This file is part of the Symfony framework.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace …Run Code Online (Sandbox Code Playgroud) 我有以下文件夹结构,我保留PowerShell模块:
C:
PsModules
...
util
util.psm1 (this contains implementation of 'Test-Function')
util.test.ps1
ftp
ftp.psm1
http.test.ps1
...
Run Code Online (Sandbox Code Playgroud)
大约有50个文件夹和模块c:\PsModules.
我已将环境变量设置PSModulePath为包含c:\PsModules.这似乎符合Microsoft文档和此答案中描述的 "格式良好的模块"的条件.
Test-Function从ISE调用时有时无法自动找到.实际上,在任何新发布的ISE上,总会有一些(似乎不可预测的)模块无法自动找到.Test-Function例如,无法自动查找,如下所示:
PS C:\> Test-Function
Test-Function : The term 'Test-Function' is not recognized as the name
of a cmdlet, function, script file, or operable program. Check the
spelling of the name, or if a path was included, verify that the path is
correct and try …Run Code Online (Sandbox Code Playgroud) autoloader ×10
php ×8
composer-php ×3
autoload ×2
doctrine-orm ×1
module ×1
node.js ×1
npm ×1
powershell ×1
symfony ×1