3

(1) 主要なアプリケーション グループのコンポーネント (コントローラー/ビュー/など) が結合され、(2) Laravel のサポート コードが Web サーバーのドキュメント ルートの外にあるように、Laravel 4 サイトを構築しようとしています。デフォルトの laravel ホームページは正常に読み込まれますが、名前空間付きのコントローラーを正しくルーティングすることができません。関連するファイル構造は次のとおりです。

/ [Project Root]
     /laravel [full laravel install here]
          composer.json
          /app
               /controllers
                    BaseController.php
     /dev
          /htdocs
               index.php
               /app
                    /PageTypes
                         /Home
                              /controllers
                                   HomeController.php
                              /views
                                   HomeView.blade.php

デフォルトのlaravelランディングページは正常にロードされています。しかし、独自の名前空間を持つコントローラーをセットアップしようとすると、エラーが発生し続けます。

これはHomeController.phpです:

namespace PageTypes;

use Home\controllers;

class HomeController extends BaseController {

    public function showWelcome()
    {
        return View::make('hello');
    }

}

ここに routes.phpがあります:

<?php

Route::get('/', function()
{
    return View::make('hello');
});

Route::get('/home', 'PageTypes\Home\controllers\HomeController@showWelcome' );

このセットアップでは、エラーが発生します: "Symfony \ Component \ Debug \ Exception \ FatalErrorException Class 'PageTypes\BaseController' not found" OK、laravel は少なくとも HomeController.php を見つけています。

他の多くの SO 応答から、BaseController を \BaseController に変更してみるように言われました。その 1 つの変更を行い、他のすべてを同じままにすると、「ReflectionException: クラス PageTypes\Home\controllers\HomeController が存在しません」というエラーが発生しました。なに?... >.<

名前空間、psr-0、およびlaravelのルーティングの交差点で何かを理解していません。助けていただければ幸いです。

フォローアップの質問: (1) これをデバッグするためにどのような手順を実行できましたか? NGINX のログは、スローされた例外エラーで見られるもの以外は何も教えてくれません。(2) 同様にレイアウトされた github の laravel シードに出くわした人はいますか? 何か参考になれば幸いです。

ここに私の構成設定があります:

// index.php 
...
require __DIR__.'/../../laravel/bootstrap/autoload.php';
$app = require_once __DIR__.'/../../laravel/bootstrap/start.php';
...

// bootstrap/autoload.php
...
require __DIR__.'/../vendor/autoload.php';
...


// bootstrap/paths.php
...
'app' => __DIR__.'/../app',
'public' => __DIR__.'/../../dev/htdocs/',
'base' => __DIR__.'/..',
'storage' => __DIR__.'/../app/storage',
...

// compose.json
{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "require": {
        "laravel/framework": "4.0.*"
    },
    "autoload": {
        "psr-0": {
            "PageTypes": "../dev/htdocs/app"
        },
        "classmap": [
            "app/commands",
            "app/controllers",
            "app/models",
            "app/database/migrations",
            "app/database/seeds",
            "app/tests/TestCase.php"
        ]
    },
    "scripts": {
        "post-install-cmd": [
            "php artisan optimize"
        ],
        "pre-update-cmd": [
            "php artisan clear-compiled"
        ],
        "post-update-cmd": [
            "php artisan optimize"
        ],
        "post-create-project-cmd": [
            "php artisan key:generate"
        ]
    },
    "config": {
        "preferred-install": "dist"
    },
    "minimum-stability": "dev"
}
4

1 に答える 1

5
class HomeController extends \BaseController {

基本的に、名前空間にいるため、グローバル名前空間で BaseController を解決する必要があります(これが の\動作です)。

あなたはまた、持っていることで逃げることができます

use \BaseController;

class HomeController extends BaseController {

しかし、コントローラー全体で一度しか BaseController を参照しないため、あまり意味がありません。

PageTypes\Home\controllers\HomeControllerもう1つの潜在的な問題は、参照しているものである名前空間です。これは実際にはパス名ではなく、探している名前空間名です (PSR に続くオートローダーがディレクトリ構造を名前空間に一致させるのはたまたまです)。

使ってみて

namespace PageTypes\Home;

ただの代わりにPageTypes

于 2013-09-08T21:39:59.120 に答える