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 中无法自动加载 psr-4

Laravel 4无法从命名空间控制器中找到BaseController

laravel5.4菜鸟进阶001

为什么我的ajax请求从Laravel控制器重复相同的数据?

Laravel 4.2 InvalidArgumentException 未找到视图

Laravel 不经常用的小技巧