クラフト3のプラグインのルーティングの問題

だから私は以前スタンドアロンのYii
2アプリをCraftモジュールに変換していて、ルーティングに関するいくつかの問題を抱えています。私は古いURL構造を可能な限り保持したいと考えています。そのため、私はプラグインを作成し、ルートを登録しました。しかし、私は問題に気づきました.Url
::
to()を呼び出すと、プラグインで明示的に経路を定義していても、actionTriggerパラメータに依存するURLが返されます。

ここに私のプラグインでそれらを持っているようなルートがあります:

class CustomerPortal extends craftbasePlugin
{
    public function init()
    {
        Event::on(
            UrlManager::class,
            UrlManager::EVENT_REGISTER_SITE_URL_RULES,
            function(crafteventsRegisterUrlRulesEvent $event) {
                $event->rules['portal/'] = 'customer-portal/portal/';

ルートにリダイレクトするためにコントローラで呼び出しを行うと、定義したルールではなく、アクションパラメータを使用してURLが構築されます。例えば:

class UserController extends craftwebController
{
    public function actionRedirect()
    {
        echo Url::to(['checkout');
       //I'd expect to see '/checkout', but instead we get 
       //'/actions/customer-portal/user/checkout' since we aren't
       //applying either of our rules.
    }

    public function actionCheckout()
    {
    }

パース時にはルールがチェックされているようですが、URL作成時にはチェックされていないようですが、アクションプレフィックスが付いていればルールは解析されませんが、未加工アクションが試行されます。

私は何かを逃しているのですか、これはバグですかどちらかの方法です、誰もそれを回避する方法を考えることができますか?

Edit: Figured out the issue with routes not resolving I had
originally, it turns out in the end, my issues was that the regex
in the rules wasn’t accounting for the fact that many of routes
have dashes in them (for example: /user/billing-info). The default
Yii docs say to use , but that doesn’t match the dash character in
the URL. Using works perfectly and makes this all work.

それは、UrlManagerが正常に動作するためにUrlManager
::を参照する何か他のものがまだ得られていないと言っています.UrlManagerが既存のルートと一致するかどうかを確認する前にURLにアクションパラメータを追加しているようです。

ベストアンサー

編集:

私はとても残念です –
私はそれを台無しにしました…私はクラフトコードを再チェックし、私はすべての最初の答えが間違っていた。あなたが私のために何の問題もないことを願っています。

正解はこれです….

Event::on(UrlManager::class, UrlManager::EVENT_REGISTER_SITE_URL_RULES, function(RegisterUrlRulesEvent $event) {
    $event->rules['redirect/'] = 'customer-portal/portal/';
    $event->rules['checkout']              = 'customer-portal/portal/checkout';
});

あなたのコントローラで

public function actionIndex(){
    $request = Craft::$app->getRequest();
    $method = $request->getParam('action');
    return $this->redirect($method);
}

バックエンド関数にアクセスするには、 protected $ allowAnonymous =
true;
またはすべての関数を含む配列をにする必要があります。 ‘functionOne’、
‘functionTwo’]; コントローラは次のようになります

class UserController extends Controller {
    protected $allowAnonymous = true;

   //pretend the request is /redirect/foo and we have created the rule 
   //$event->rules['foo']                    = 'customer-portal/user/foo'; and
   //$event->rules['redirect/']  = 'customer-portal/user/redirect';
    public function actionRedirect(){
        $request = Craft::$app->getRequest();
        $method = $request->getParam('action');
        return $this->redirect($method);
    }

    public function actionFoo(){
        die("foo");
    }

}

古い投稿…これを無視する

It’s not a bug, that’s the way how craft handles it. Unlike
in other cms plugins in craft are not supposed to handle entire
frontend page requests in order to render the entire page. You can
access actions from controllers only via the /action url.
Everything else is handled by entries/elements

So you’ll not be able to achieve what you want since craft
tries to access an entry when you don’t include an action url. All
frontend request without an action url need to be related to an
entry/element or a category. So when you try to access
/redirect craft will search for an entry with the slug
redirect

あなたが望むものは次のとおりです:

  1. creating an entry with the slug “redirect”
  2. $entry = Craft::$app-> //your logic to fetch this
    specific entry
  3. $this->redirect($entry->url)

When you want to create a plugin for other people to use it,
you have to create a settings page, include a relation field to
that and let other people link an entry to the redirect -> you
can fetch this entry from your settings and redirect to it.

The other thing… $event->rules['portal/'] =
'customer-portal/portal/';
is wrong.. Take a look at this
documentation
$event->rules['portal/'] =
'customer-portal/portal/handle-redirect';
and in your
portalController

public function actionHandleRedirect(){
    $request = Craft::$app->getRequest();
    $function = "action" . $request->getParam('action');
    $this->$function();
}

しかし、私はあなたにそれをしないで、これらのことを処理する工芸の方法を使用することをお勧めします

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です