【问题标题】:Package Controllers in Laravel 4Laravel 4 中的包控制器
【发布时间】:2013-01-03 04:58:29
【问题描述】:

我想在我的 Laravel 4 包中包含控制器,但我无法让路由工作。

我已按照 Laravel 4 文档中的包说明进行操作,并获得了使用非控制器路由的 routes.php 文件。

谁能给我一些关于如何让包控制器在 Laravel 4 中工作的说明,非常感谢。

提前致谢。

拉尔斯

// EDIT:

// routes.php

   Route::get('admin', 'Package::AdminController@index'); // Does not work

   Route::get('admin', function(){  // Works fine
       return 'Dashboard';
   })

【问题讨论】:

  • 请发布您的 routes.php 代码,显示您尝试过的内容
  • 嘿,你设法让它工作了吗?如果是这样的话。你能用解决方案发布答案​​吗?
  • 您能否更具体地说明“无法使路由正常工作”?你得到了什么? 404错误?
  • @AkhyarAmarullah 我只是得到一个空白页,没有错误。

标签: php laravel laravel-4


【解决方案1】:

在您的包裹的服务提供商中,您是否包含了您的路线文件?我不相信 L4 会自动加载路由文件。你可以在任何地方做,但我怀疑这是最合适的地方。

public function register()
{
    $this->package('vendor/pkgname');
    require __DIR__.'/../routes.php';
}

【讨论】:

  • 感谢您的回答,但我已将路线文件包含在包裹的服务提供商中。非控制器路由在这里工作正常。
【解决方案2】:

你这样做了吗:

composer dump-autoload

需要告知自动加载器这些闪亮的新类。我还建议您检查网络服务器日志是否有错误。

【讨论】:

    【解决方案3】:

    我不知道您的具体情况,也不知道这是否是解决此问题的“正确”方法,但由于我遇到了同样的问题,我想我会分享我是如何解决它的。

    我将包控制器放在控制器子目录中,这样我的目录结构如下所示:

    /src
        /Vendor
            /Package
                PackageServiceProvider.php
        /config
        /controllers
        /lang
        /migrations
        /views
    /tests
    /public
    

    然后,我将控制器文件夹添加到包的 composer.json 自动加载类映射中。

    {
        "name": "kevin-s-perrine/my-first-packge",
        "description": "",
        "authors": [
            {
                "name": "Kevin S. Perrine",
                "email": "removed@somewhere.com"
            }
        ],
        "require": {
            "php": ">=5.3.0",
            "illuminate/support": "4.0.x"
        },
        "autoload": {
            "classmap": [
                "src/migrations",
                "src/controllers"
            ],
            "psr-0": {
                "KevinSPerrine\\MyFirstPackage": "src/"
            }
        },
        "minimum-stability": "dev"
    }
    

    最后,我在包的根目录下运行composer dump-autoload,然后在路由文件中按名称引用控制器。

    Route::get('myfirstpackage', 'MyFirstPackageHomeController@getIndex');
    

    【讨论】:

    • 我认为这个答案要好得多。
    【解决方案4】:

    您还需要使用控制器的命名空间来引用控制器

    Route::get('/admin', 'PackageNS\Package\Controllers\AdminController@getIndex');
    

    甚至

    Route::controller('PackageNS\Package\Controllers\AdminController', 'admin');
    

    【讨论】:

    • 这对我有帮助,但我仍然收到错误消息,因为我创建的控制器扩展了它无法再找到的基本控制器。我得到FatalErrorException: Error: Class 'PackageNS\Package\BaseController' not found。大概我需要添加use path\to\basecontroller; 或类似的东西,但我不知道基本控制器的路径。谢谢
    • @Al_,您需要包含控制器的完整命名空间路径,或者使用 use 指令来包含它。 use Illuminate\Routing\Controllers\Controllerextends \Illuminate\Routing\Controllers\Controller
    猜你喜欢
    • 1970-01-01
    • 2013-02-03
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 2017-01-10
    相关资源
    最近更新 更多