【问题标题】:laravel controller is not instantiablelaravel 控制器不可实例化
【发布时间】:2015-01-08 01:50:19
【问题描述】:

我在 routes.php 中调用我的控制器:

Route::get('request', 'Controller@request');

在我的控制器中是方法请求:

class Controller extends BaseController {

   public function request()
   {
        $number1 = int rand ( 10, 20 );
        $number2 = int rand ( 0, 10 );
        return View::make('request', array($number1, $number2));
   }
}

问题是,我得到了错误:

exception 'Illuminate\Container\BindingResolutionException' with message 'Target [Controller] is not instantiable.'

我正在浏览互联网以找到解决方案。很多类似的错误都与接口有关,我找不到任何有用的东西。我重命名了我的控制器一次,导致一些错误,但我用“composer dump-autoload”命令修复了它。

【问题讨论】:

    标签: php exception laravel controller instantiation


    【解决方案1】:

    我也遇到了同样的问题:

    Target [App\Http\Controllers\Frontend\Booking\BookingController] is not instantiable.
    

    问题是我已经将我的构造函数声明为私有的。

    参考代码:

    namespace App\Http\Controllers\Frontend\Booking;
    
    use App\Http\Controllers\Controller;
    
    class BookingController extends Controller
    {
        private function __construct() {
             ...
        }
        ...
    }
    

    删除构造函数或将其公开解决了我的错误。由于我对整个单实例类(单例)范式或者 Laravel 是否支持它(必须阅读)不太熟悉,因此没有尝试过将其作为私有的。

    在其他地方没有发现这种特殊情况,所以希望它对某人有所帮助。

    【讨论】:

      【解决方案2】:

      别名部分检查config/app.php

      'Controller'        => 'Illuminate\Routing\Controller',
      

      控制器类已经存在。如果你想要它,你必须命名它。

      例如

      <?php namespace foo;
      
      class controller extends \BaseController {
      
      public function bar(){}
      
      }
      

      在路线中:

      Route::get('bar',['as'=>'foo.bar', 'uses' => '\foo\controller@bar']);
      

      【讨论】:

        【解决方案3】:

        从以下位置更改控制器类:

        class Controller extends BaseController {
        

        收件人:

        class ControllerController extends BaseController {
        

        为什么要这样做?因为 Controller 类已经存在于 Laravel 中(BaseController 扩展自 Controller),所以你可能想将其命名为其他名称。

        还要确保文件在controllers 目录中保存为ControllerController.php

        你的路线也应该是这样的:

        Route::get('request', 'ControllerController@request');
        

        我已经在我的本地开发机器上快速测试了这个,它可以工作。

        【讨论】:

        • Why? because laravel requires your name all your controller classes with the suffix "Controller".... 错误 你可以使用任何名称(foo, bar)... . 后缀不是必需的。唯一需要的是,它必须从 BaseController 扩展
        • 谢谢,我不知道。我已经更新了我的答案。对 Laravel 和学习来说还是相当新的 :)
        • laravel 太牛了!玩得开心!
        • 我完全同意!到目前为止,与 Laravel 的合作非常愉快。
        • 也使用命名空间(如果适用)......它为应用程序带来了另一个维度。
        【解决方案4】:

        我所做的和为我工作的是这样的:

        app/Http/Controllers 下使用类

        Controlles.php

        <?php namespace App\Http\Controllers;
        
        use Illuminate\Foundation\Bus\DispatchesJobs;
        use Illuminate\Routing\Controller as BaseController;
        use Illuminate\Foundation\Validation\ValidatesRequests;
        use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
        
        abstract class Controller extends BaseController
        {
            use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
        }
        

        YourController.php

        <?php namespace App\Http\Controllers;
        
        class YourController extends Controller
        {
            public function request() {
                $number1 = int rand ( 10, 20 );
                $number2 = int rand ( 0, 10 );
                return View::make('request', array($number1, $number2));
            }
        }
        

        routes.php 中的调用:

        Route::get('request', 'YourController@request');
        

        【讨论】:

          【解决方案5】:

          我知道这是旧的,但在谷歌搜索的情况下;确定

          protected $namespace = 'App\\Http\\Controllers';
          

          在您的 RouteServiceProvider 中未注释。 Laravel 使用该字段来假设您的 Controller 位于哪个命名空间,但没有它,您必须在 Route 定义中明确说明。

          【讨论】:

            猜你喜欢
            • 2020-12-18
            • 2023-03-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多