由于最新的Rails 3版本不再自动加载来自lib的模块和类,加载它们的最佳方法是什么?
来自github:
Run Code Online (Sandbox Code Playgroud)A few changes were done in this commit: Do not autoload code in *lib* for applications (now you need to explicitly require them). This makes an application behave closer to an engine (code in lib is still autoloaded for plugins);
我正在学习高级PHP标准并尝试实现新的有用方法.早些时候我__autoload只是用来逃避包括每页上的多个文件,但最近我看到了一个提示__autoload manual
spl_autoload_register()为自动加载类提供了更灵活的替代方法.因此,不鼓励使用__autoload(),将来可能会弃用或删除.
但我真的无法弄清楚如何实施spl_autoload和spl_autoload_register
我已将我的一个应用程序从Rails 4.2.6升级到Rails 5.0.0.该升级指南说,是自动加载功能在生产中默认情况下禁用现在.
现在我总是在生产服务器上出错,因为我在application.rb文件中加载了所有带有自动加载的lib 文件.
module MyApp
class Application < Rails::Application
config.autoload_paths += %W( lib/ )
end
end
Run Code Online (Sandbox Code Playgroud)
现在,我已经设定了config.enable_dependency_loading,true但我想知道是否有更好的解决方案.必须有一个原因,默认情况下在生产中禁用自动加载.
当我尝试使用自动加载和名称空间时,我收到此错误:
致命错误:类"的Class1"中找不到/usr/local/www/apache22/data/public/php5.3/test.php上线10
谁能告诉我我做错了什么?
这是我的代码:
Class1.php:
<?php
namespace Person\Barnes\David
{
class Class1
{
public function __construct()
{
echo __CLASS__;
}
}
}
?>
Run Code Online (Sandbox Code Playgroud)
test.php的:
<?php
function __autoload($class)
{
require $class . '.php';
}
use Person\Barnes\David;
$class = new Class1();
?>
Run Code Online (Sandbox Code Playgroud) 我一直在寻找网络,在这个问题上没有运气.我在我的代码中使用了作曲家的自动加载composer.json:
"autoload": {
"psr-0": {"AppName": "src/"}
}
Run Code Online (Sandbox Code Playgroud)
但是我需要在比供应商文件夹更高的级别进行自动加载.
做这样的事情不起作用:
"autoload": {
"psr-0": {"AppName": "../src/"}
}
Run Code Online (Sandbox Code Playgroud)
有谁知道修复或我如何做到这一点?
我刚刚通过Composer安装了Sebastian Bergmann的PHPUnit版本3.7.19,并编写了一个我想进行单元测试的课程.
我想让我的所有课程自动加载到每个单元测试中,而不必使用include或require在我的测试的顶部,但这证明是困难的!
这是我的目录结构的样子(尾部/斜杠表示目录,而不是文件):
我的composer.json文件包括以下内容:
"require": {
"phpunit/phpunit": "3.7.*",
"phpunit/phpunit-selenium": ">=1.2"
}
Run Code Online (Sandbox Code Playgroud)
我的returns.php类文件包括以下内容:
<?php
class Returning {
public $var;
function __construct(){
$this->var = 1;
}
}
?>
Run Code Online (Sandbox Code Playgroud)
我的returnsTest.php测试文件包括以下内容:
<?php
class ReturningTest extends PHPUnit_Framework_TestCase
{
protected $obj = null;
protected function setUp()
{
$this->obj = new Returning;
}
public function testExample()
{
$this->assertEquals(1, $this->obj->var); …Run Code Online (Sandbox Code Playgroud) 我正在研究Rails 4.2应用程序并刚刚添加app/services/fetch_artists.rb到结构中.在这个文件里面,我已经定义了一个class FetchArtists; end.
试图运行rails r 'FetchArtists'它给我一个NameError: uninitialized constant FetchArtists.
我试过看,ActiveSupport::Dependencies.autoload_paths确实,app/services不存在:
/.../app/assets
/.../app/controllers
/.../app/helpers
/.../app/jobs
/.../app/mailers
/.../app/models
/.../app/controllers/concerns
/.../app/models/concerns
/.../spec/mailers/previews
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么这个文件夹没有自动加载,我该怎么办呢?
编辑
很奇怪,在反复运行上面的命令后rails runner,新文件夹出现在自动加载路径上.我不知道为什么会发生这样的延迟.
有人建议这可以处理spring.我想更多地了解这一点,因为它也可能在这种情况下帮助许多其他人.
这是我自动加载我controllers文件夹中的所有类的方法,
# auto load controller classes
function __autoload($class_name)
{
$filename = 'class_'.strtolower($class_name).'.php';
$file = AP_SITE.'controllers/'.$filename;
if (file_exists($file) == false)
{
return false;
}
include ($file);
}
Run Code Online (Sandbox Code Playgroud)
但我也有models文件夹中的课程,我也想自动加载它们 - 我该怎么办?我应该复制上面的自动加载,只是改变路径models/(但不是重复?)?
谢谢.
编辑:
这些是我在控制器文件夹中的类文件名:
class_controller_base.php
class_factory.php
etc
Run Code Online (Sandbox Code Playgroud)
这些是我在模型文件夹中的类文件名:
class_model_page.php
class_model_parent.php
etc
Run Code Online (Sandbox Code Playgroud)
这就是我通常命名我的控制器类的方法(我使用下划线和低位),
class controller_base
{
...
}
class controller_factory
{
...
}
Run Code Online (Sandbox Code Playgroud)
这就是我通常命名我的模型类的方法(我使用下划线和lowcaps),
class model_page
{
...
}
class model_parent
{
...
}
Run Code Online (Sandbox Code Playgroud) 如何自动加载辅助函数(在任何类之外)?我可以在composer.json某种应该先加载的引导程序文件中指定吗?
autoload ×10
php ×6
composer-php ×3
class ×1
module ×1
namespaces ×1
oop ×1
phpunit ×1
psr-0 ×1
spl ×1