1

だから私は大量のstackoverflowとphalconフォーラムのスレッドを読んできました..(私はこのフレームワークが嫌いになり始めています)、何も機能していないようで、たとえばLaravelのように理由を説明していません.

私はこのアプリケーション構造で操作できるようにしようとしています:

ここに画像の説明を入力

ご覧のとおり、サブフォルダーで名前空間付きのコントローラーを使用して、コードをさらに整理するだけです。

すべての説明によると、ここに私のloader.phpがあります:

<?php

$loader = new \Phalcon\Loader();

/**
 * We're a registering a set of directories taken from the configuration file
 */
$loader->registerDirs(
    array(
        $config->application->controllersDir,
        $config->application->modelsDir,
        $config->application->pluginsDir
    )
)->register();

私の知る限り、Phalcon は、registerDirs を介して使用される場合、見つからないクラスのすべてのサブフォルダーをトラバースする必要があります。

次に、メイン ルートの後に特定のコントローラーへのルートを定義して、ベース ディレクトリ内のコントローラーにインデックスを付けます。

<?php

$router = new Phalcon\Mvc\Router(false);

$router->add('/:controller/:action/:params', array(
    'namespace' => 'App\Controllers',
    'controller' => 1,
    'action' => 2,
    'params' => 3,
));

$router->add('/:controller', array(
    'namespace' => 'App\Controllers',
    'controller' => 1
));

$router->add('/soccer/soccer/:controller', array(
    'namespace' => 'App\Controllers\Soccer',
    'controller' => 1
));

$router->add('/soccer/:controller/:action/:params', array(
    'namespace' => 'App\Controllers\Soccer',
    'controller' => 1,
    'action' => 2,
    'params' => 3
));

return $router;

そして、私のコントローラーの1つは次のようになります。

<?php  namespace App\Controllers\Soccer;

use App\Controllers\ControllerBase as ControllerBase;

class IndexController extends ControllerBase
{

    public function indexAction()
    {

    }

}

ここで何が問題なのですか?デフォルトの最上位名前空間が登録されていませんか? 何か不足していますか?

これはうまくいきません。app/controllers/soccer/IndexController.php に移動する予定の myserver.com/soccer を開こうとすると、代わりに次のように表示されます。

SoccerController ハンドラー クラスを読み込めません

これは基本的に、/controllers ディレクトリで SoccerController.php を探しており、サブフォルダーの定義とルートを完全に無視していることを意味します。

ファルコン 1.3.0

これに1週間立ち往生。どんな助けでも - 大変感謝しています。

4

3 に答える 3

5

名前空間を使用して ControllerBase と残りのコントローラーをコントローラーフォルダーにロードする際に問題が発生しました。他のサンプル プロジェクトが正常に機能したため、苦労していました。また、 setDefaultNamespaceを設定するはずだったディスパッチャ宣言に小さな詳細が欠けていることに気付きました。

(参照: https://github.com/phalcon/vokuro/blob/master/app/config/services.php )

$di->set('dispatcher', function () {

    $dispatcher = new Dispatcher();

    $dispatcher->setDefaultNamespace('App\Controllers');

    return $dispatcher;
});

または、このようにルーティング宣言ファイルで直接指定できます

$router->add("/some-controler", array(
    'namespace' => 'App\Controllers'
    'controller' => 'some',
    'action' => 'index'
));

それもうまくいくはずです。最初は名前空間で少し混乱するかもしれませんが、一度慣れると、この非常に高速なフレームワークが気に入るはずです

于 2014-04-15T22:09:24.123 に答える
2

名前空間に大文字が含まれているようです

アプリ\コントローラー\サッカー

あなたのフォルダ構造はそうではありません

アプリ\コントローラー\サッカー

私のアプリでは、名前空間を持つコントローラーがあり、フォルダーの大文字と小文字を変更しようとしたところ、それらが一致せず、クラスが見つからないというエラーが発生しました。

もちろん、それは疑問を投げかけます。名前空間を設定する価値のあるコントローラーをいくつ持つことを計画していますか? コントローラーとアクションを機能またはコンテンツごとにグループ化していますか? 以前は Zend にたくさんのコントローラーがありましたが、今ではそれらを機能別にグループ化したので、16 個しかなく、ずっと満足しています。たとえば、サッカー、ラグビー、ホッケーなどは、おそらくスポーツ コントローラーを共有できると思います。記事、リーグの順位などには、多くの共通データがあります。

ps ファルコンを諦めないで!私の経験では、私が使用した他のどの PHP フレームワークよりもはるかに高速であり、多くのことを我慢する価値があります :)

于 2014-04-08T15:45:18.113 に答える