Laravel 4 子目录控制器不加载输入类
Posted
技术标签:
【中文标题】Laravel 4 子目录控制器不加载输入类【英文标题】:Laravel 4 subdirectory controller doesn't load Input class 【发布时间】:2014-10-12 23:44:22 【问题描述】:我是 Laravel 新手,遇到子目录问题。 我想在控制器文件夹中创建一个管理文件夹,到目前为止它正在工作。但是当我尝试使用 Laravel 的 Input 类时,它说找不到它。
我的路线:
Route::group(array('prefix'=> 'admin', 'before' => 'auth.admin'), function()
Route::resource('/users','Admin\\UsersController');
Route::resource('/products','Admin\\ProductsController');
Route::resource('/categories','Admin\\CategoriesController');
Route::resource('/orders','Admin\\OrdersController');
Route::resource('/reviews','Admin\\ReviewsController');
);
产品控制器:
<?php namespace admin;
class ProductsController extends \BaseController
protected $layout = 'master';
/**
* Instantiate a new ProductsController instance.
*/
public function __construct()
$this->beforeFilter('auth.admin');
/**
* Display a listing of the resource.
* GET /products
*
* @return Response
*/
public function index()
$input = Input::all(); //here is where it finds the error
还有 composer.json 自动加载:
"autoload":
"classmap": [
"app/commands",
"app/controllers/",
"app/models",
"app/database/migrations",
"app/database/seeds",
"app/tests/TestCase.php",
"app/controllers/Admin"
]
,
谢谢!
编辑:
我也尝试过使用 Input(和 \Input),但它返回了“找不到 Class 'Facade'”错误,当我尝试时:
use \Illuminate\Support\Facades\Facade;
use Input;
还是不行。
编辑 2:
现在使用:
use Illuminate\Support\Facades\Input;
并返回相同的错误。
编辑 3: @ChristopherRathgeb 建议的修改是否现在找不到产品模型。
答案:
在完成@ChristopherRathgeb 建议的修改并将\ 添加到视图和输入类(例如$input = \Input:all();
)之后,它起作用了!现在用我刚刚使用 action(admin\ProductsController) 的操作方法重定向到这些控制器,它起作用了!
感谢所有提供帮助的人!
【问题讨论】:
您需要use
Input 或 Facade 似乎很奇怪,因为它们应该在应用程序启动后立即自动注册。将控制器移动到子目录后,您 composer dump-autoload
了吗?
感谢您的回复@Don't Panic,我成功运行composer dump-autoload
,但它仍然无法正常工作(让我发疯哈哈)
尝试从路由中删除 `Admin\\` 部分。做 composer dump-autoload 后,autoloader 应该可以得到控制器而不需要指定子目录。
我这样做了,得到一个“类 ProductsController 不存在”错误
如果您查看 composer/autoload_classmap.php,它是否在正确的位置列出了您的控制器文件?
【参考方案1】:
首先你可以使用基于命名空间的路由组:
Route::group(['namespace'=>'admin','prefix'=> 'admin', 'before' => 'auth.admin'],function()
Route::resource('/users','UsersController');
Route::resource('/products','ProductsController');
Route::resource('/categories','CategoriesController');
Route::resource('/orders','OrdersController');
Route::resource('/reviews','ReviewsController');
);
接下来你的输入问题是你需要包含 Input 门面:
删除这个:
use \Illuminate\Support\Facades\Facade;
use Input;
并将以下内容添加到文件顶部:
use Illuminate\Support\Facades\Input;
注意:此答案使用 php 5.4 数组语法。如果您仍在使用 php 5.3,请将 [] 换成 array()。
【讨论】:
感谢您的回答!我已经听从了你的建议,但我仍然收到“未找到类 'Facade'”错误。 :// 您是否有任何示例代码可以显示您对 Facade 的使用情况?我不知道你会如何在你的控制器中使用它。通常 Facade 类是子类。 对不起,但我不认为我有任何使用 Facade 的示例代码,我实际上什至不知道它是什么......如果你可以更具体地了解你想要的文件让我看看我很高兴发布它!$input = Input::all();
是Facade的用法吧?类输入扩展外观。
重要提示:确保use
语句位于namespace
语句之后,否则PHP 将无法正确识别。【参考方案2】:
将Input
类导入您正在使用的命名空间。
<?php namespace admin;
use \Illuminate\Support\Facades\Input;
class ProductsController extends \BaseController
.....
或者从其命名空间调用Input
:
public function index()
$input = \Illuminate\Support\Facades\Input::all(); //here is where it finds the error
【讨论】:
感谢您的回答!但不幸的是 id 没有工作......它返回错误“找不到类'Facade'”并且当我尝试“使用Facade;”时它仍然没有工作...... 那不是 Facade 的命名空间。试试use \Illuminate\Support\Facades\Facade;
现在我使用了use \Illuminate\Support\Facades\Facade;
,但它仍然无法正常工作:/
您是否尝试过使用第二个选项调用 Input? $input = \Input::all();
没有 use
声明?在这种情况下,这可能更适合您的需求。 Facade
不应直接调用,而应包含在 Input
类中。
@Christopher Rathgeb 是对的。我道歉。其实是use \Illuminate\Support\Facades\Input;
对不起!以上是关于Laravel 4 子目录控制器不加载输入类的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 4无法从命名空间控制器中找到BaseController
为什么我的ajax请求从Laravel控制器重复相同的数据?