将控制器添加到Laravel 5包

enc*_*nce 4 php laravel

最近,我一直只为我的L5包创建模型,但现在我想尝试引入一个Controller.我一直在关注这个,但我总是得到错误"Class StatController does not exist".

文件夹结构

/src
    routes.php
    /Controllers
        StatController.php
Run Code Online (Sandbox Code Playgroud)

StatController.php

<?php namespace Enchance\Sentrysetup\Controllers;

use App\Http\Controllers\Controller;

class StatController extends Controller {

    public function index() {
        return 'Moot.';
    }

}
Run Code Online (Sandbox Code Playgroud)

服务提供者

public function register()
{
    // Can't get this to work
    include __DIR__.'/routes.php';
    $this->app->make('Enchance\Sentrysetup\Controllers\StatController');

    $this->app['sentrysetup'] = $this->app->share(function($app) {
        return new Sentrysetup;
    });
}
Run Code Online (Sandbox Code Playgroud)

routes.php文件

Route::get('slap', 'StatController@index');
Run Code Online (Sandbox Code Playgroud)

有没有人有另一种方法将控制器分配给L5包?

Ste*_*man 10

您无需呼叫$this->app->make()控制器.控制器由Laravel的IoC自动解决(意味着Laravel自动创建/实例化与路由相关的控制器).

boot()在自定义程序包服务提供程序的函数中包含您的路由:

public function boot()
{
    include __DIR__.'/routes.php';     
}
Run Code Online (Sandbox Code Playgroud)

在你的routes.php档案里面:

Route::group(['namespace' => 'Enchance\Sentrysetup\Controllers'], function()
{
    Route::get('slap', ['uses' => 'StatController@index']);
})
Run Code Online (Sandbox Code Playgroud)

另外,只是一个提示.你应该PascalCase您的命名空间:

Enchance\SentrySetup\Controllers
Run Code Online (Sandbox Code Playgroud)

注意设置中的大写S.

boot()方法应该用于注册你的路由,因为当Laravel启动时,它会遍历你config/app.php文件中的每个服务提供者,创建它们,调用register()方法(将服务提供者"提供"的任何依赖项插入到Laravel的singleton/IoC容器中) .

然后,Laravel再次通过它们并调用该boot()方法.这可确保boot()方法中提供服务提供者所需的任何依赖项.

服务提供商启动方法 - Laravel Docs