Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Routerの実装 #7

Closed
shinichi-takahashi opened this issue Dec 17, 2014 · 19 comments
Closed

Routerの実装 #7

shinichi-takahashi opened this issue Dec 17, 2014 · 19 comments
Labels
enhancement 機能追加

Comments

@shinichi-takahashi
Copy link

  • 実装時には下記3つのファイルを使用する
    • html/index.php:html/router.phpを読み込むのみ
    • html/router.php:ルーターのロジック(定義ファイル以外読み込まない)
    • html/routes.php:ルーティング定義ファイル
  • URLをparseし、対応したclassを呼び出す
  • html/routes.phpの定義は以下の通り
$arrMaps = array(
    array(
        'method' => 'GET|POST',
        'path'   => '/',
        'dir'    => '',
        'class'  => 'index'
    ),
    array(
        'method' => 'GET|POST',
        'path'   => '/products/detail',
        'dir'    => 'products',
        'class'  => 'detail'
    ),
    array(
        'method' => 'GET|POST',
        'path'   => '/admin/',
        'dir'    => 'admin',
        'class'  => 'index'
    ),
    array(
        'method' => 'GET|POST',
        'path'   => '/admin/login',
        'dir'    => 'admin',
        'class'  => 'login'
    ),
);
@nobuhiko
Copy link
Contributor

ここまでするなら class/pages/ -> controller に変更し、switch ($this->getMode()) を吸収してしまったほうがよくないでしょうか?

@izayoi256
Copy link
Contributor

ADMIN_DIRの機能を残すようであれば、

array(
    array(
        'method' => 'GET|POST',
        'admin' => true,
        'path' => '/login',
        'dir' => 'admin',
        'class' => 'login',
    )
)

のようにadminをパラメータ化して、/ADMIN_DIR/loginへのアクセス時にこのルートへパースする方がいいのではないでしょうか。

nobuhiko様のコントローラ化は私も賛成ですが、そうするとビジネスロジックをコントローラから切り離さないとコントローラファイルがかなり複雑化しそうな気がします・・。

@pineray
Copy link
Contributor

pineray commented Dec 18, 2014

$arrMaps を定義した後に hook を設置して、プラグインによるルーティング定義を収集して $arrMaps に追加。
さらにその後にもう一つ hook を設置して $arrMaps を渡し、コアや他のプラグインの定義を書き換えられるようにすれば、かなり便利になりますね。

@pineray
Copy link
Contributor

pineray commented Dec 18, 2014

$arrMaps は path をキーにした連想配列にしたほうが、いろいろ扱いやすくなると思います。

@shinichi-takahashi
Copy link
Author

みなさま

コメントありがとうございます。

  • ADMIN_DIRの機能を残す
  • $arrMaps は path をキーにした連想配列
    こちら2つはRouterとしてとても扱いやすくなるため、賛成です!
    あわせると下記のイメージであってますか?
$arrMaps = array(
    // http://example.com/
    '/' => array(
        'method' => 'GET|POST',
        'dir'    => '',
        'class'  => 'index'
    ),
    // http://example.com/products/detail/
    '/products/detail/' => array(
        'method' => 'GET|POST',
        'dir'    => 'products',
        'class'  => 'detail'
    ),
    // http://example.com/admin/products/class/
    '/products/class/' => array(
        'method' => 'GET|POST',
        'admin' => true,
        'dir'    => 'products',
        'class'  => 'class'
    ),
);

@shinichi-takahashi
Copy link
Author

@pineray

$arrMaps を定義した後に hook を設置して、プラグインによるルーティング定義を収集して $arrMaps に追加。
さらにその後にもう一つ hook を設置して $arrMaps を渡し、コアや他のプラグインの定義を書き換えられるようにすれば、かなり便利になりますね。

すみません。具体的なイメージがわかず、こちらもう少し詳しく教えていただけませんか?

@shinichi-takahashi
Copy link
Author

@nobuhiko

class/pages/ -> controller に変更し、switch ($this->getMode()) を吸収してしまったほうがよくないでしょうか?

そうですねえ。
実装イメージは、CakePHPなどのFWとほぼほぼ同じですか??

@pineray
Copy link
Contributor

pineray commented Dec 24, 2014

@shinichi-takahashi

$arrMaps を定義した後に hook を設置して、プラグインによるルーティング定義を収集して $arrMaps に追加。
さらにその後にもう一つ hook を設置して $arrMaps を渡し、コアや他のプラグインの定義を書き換えられるようにすれば、かなり便利になりますね。

すみません。具体的なイメージがわかず、こちらもう少し詳しく教えていただけませんか?

プラグイン独自のページを表示する場合に、そのページのルーティング定義を追加する必要があると思うのですが、routes.php を書き換えるのは好ましい動作ではなく、hook で解決するのがスマートだと思います。
また、ページの処理をプラグイン独自のものに差し替えたい、という要望が必ず生じてくると思いますので、これも hook で解決できたほうが良いと思います。
追加と変更を別々の hook で実装したほうが、より柔軟にルーティング定義を扱うことができます。

@pineray
Copy link
Contributor

pineray commented Dec 24, 2014

@shinichi-takahashi

パスの頭の「/」は必要でしょうか?
それが関係するのはおそらくフロントページだけで、そこだけ特別に処理を行えば良いように思います。
(例えば、キーを'<front>'としておき、ルーティングのクエリが無い場合はそのページを表示する、と言った具合です)

また、method や admin などは任意の項目にして、記入がない場合はデフォルトの値を適用するほうが簡便だと思います。
(例えば method が無い場合は GET|POST を適用、admin が無い場合は false を適用)

@pineray
Copy link
Contributor

pineray commented Dec 24, 2014

@shinichi-takahashi

連投ですみません。
パスをキーにするのであれば、そもそも admin の指定は不要ですね。

$arrMaps = array(
    // http://example.com/admin/products/class/
    'admin/products/class' => array(
        'method' => 'GET|POST',
        'dir'    => 'products',
        'class'  => 'class'
    ),
);

としておき、パスの「admin」を ADMIN_DIR に差し替えれて処理すれば良いように思います。

@ttsuru
Copy link
Contributor

ttsuru commented Dec 25, 2014

HTTP_URL / HTTPS_URL をテンプレート上で記載しないといけないため、セキュリティー上、危ない実装のサイトを多く拝見します。

そのため、Routingのマッチだけではなく、URLのGenerateにも対応するほうが良いのではないでしょうか。
たとえば、 <!--{'cart'|path}-->とすれば /cart/ が生成されるとみんなで幸せになれると思います。

また、HTTPSもRoutingの値に含めてもよいのではないでしょうか。
そうすれば、httpでアクセスしている際に <!--{'shopping_index'|path}--> がテンプレートで呼び出されれば https://example.co.jp/shopping/ を出力するなどの応用がききます。

また、Symfony ComponentのRoutingの実装が参考になるとおもいます。
http://symfony.com/doc/current/components/routing/introduction.html
https://github.com/symfony/Routing

PHP5.3以上のみが動作対応なのであればそのままSymfony Componentを利用するのも手かと思いますが、いかがでしょうか。

@shinichi-takahashi
Copy link
Author

@ttsuru

URLのGenerateに関して、下記イメージであってますか?
templateに、生成の際に参照する値をいれてます。
+SSLフラグがTRUEならSSLを強制するイメージです。

$arrMaps = array(
    // http://example.com/admin/products/class/
    'admin/products/class' => array(
        'method' => 'GET|POST',
        'dir'    => 'products',
        'class'  => 'class',
        'ssl' => true,
        'template' => 'product_class'
    ),
);

また、記載できていなかったのですが、フレームワーク、SymfonyComponentは利用しない方向で考えています。
ですが、Router部分のSymfonyComponentが独立しているもので、ラップするのが容易なのであれば利用も検討したいです。
私の知識不足で申し訳ないのですが、実装イメージ(階層がどうなるとか、ラッパーはどんな感じになるとか)いただけると助かります。

@shinichi-takahashi
Copy link
Author

@pineray
hookについて、合点がいきました!ありがとうございます!

パスの頭の「/」は必要でしょうか?

こちらはどっちでもいいかな、と思っています。
任意項目については、最小構成と最大構成で提示していった方が共有しやすいかもしれませんね。

一度今までの意見を整理したいと思います。

@ttsuru
Copy link
Contributor

ttsuru commented Dec 25, 2014

@shinichi-takahashi

ご確認ありがとうございます。
お伝えしたかったイメージ通りです。

Symfony Componentsについては単独での利用も可能です。
Laravel、Silex、Drupal、phpBBあたりが利用しています。
ライセンスもMIT Licenseで使いやすいと思います。

Rotingがわかりやすく簡潔になれば、カスタマイズやテンプレートの様々な問題が解決するような気がします。
特に、Generatorがあると、テンプレートによって表記が揺れている部分が全て統一できると思います。

現在はテンプレートに依存してしまっている /products/{product_id}.html などのパスの書き換えも同時に解決は可能かと思います。

Smarty テンプレートでのイメージは以下になります。
ちなみにテンプレートエンジンも、Smartyのままでしょうか?

<!--{"product_detail"|path}-->
もしくは
<!--{path name="product_detail" product_id=1}-->
http://example.com/products/detail.php?product_id=1
Routingの設定によっては以下のようにも
http://example.com/products/detail/1.html

@shinichi-takahashi
Copy link
Author

@ttsuru

Symfony Componentsについて、ありがとうございます。
ちなみにですが、なぜフレームワークを利用しない方向になっているかというと

  • EC-CUBEがフレームワークに依存する
  • フレームワークがSymfony Componentsに依存する

の2段階で依存してしまうので懸念しておりました。
(実装経験がなく、工数感や使用感がわからないため、)実際に試してみて、
容易に利用できるようであれば、取り入れたいと思います!

Smartyに関しては、ちょっと話題がRoutingからズレてしまうので、
別Issueを立てようと思います。

疑問に思ったことなどあれば、ご自由にIssueたてて頂いて構いませんので、
(むしろいっぱい立ててほしいです)今後、何かお困りの点や不明点あらば
新規で立てていただくようにお願いします!

@ttsuru
Copy link
Contributor

ttsuru commented Dec 26, 2014

@shinichi-takahashi

ありがとうございます。
様々な点をケアできる内容を実装できるのであれば独自実装も良いかと思いますが、PEAR含め、ある程度の担保があるために利用されているのかと思いました。

それぞれが依存するという問題は「Dependency injection」(DI)という考え方も一つだと思います。
フレームワークに依存しないようにしていることはソースを見ていると、とても伝わってきますが、その分、最近主流の実装やからEC-CUBEが取り残されて行っているように思えます。
Symfony Componentsが最近海外のオープンソース系に採用されている理由も、DIの元でComponentごとに利用できるからだと思います。

現状のEC-CUBEではほぼメンテの止まったPEARやSmartyに依存している部分もあり、PHP5.3ではNoticeエラーも頻発すると思います。

ECの中で非常にシェアが高いソフトウェアだからこそ、ぜひ、この辺りも含めてECサイトの開発に道筋をつけていただけると幸いです。

@shinichi-takahashi
Copy link
Author

@ttsuru

なるほどなるほど、ありがとうございます。
今、導入について、とても悩んでいるところなんですが、Symfony ComponentのRoutingを採用することで、
EC-CUBEのプラグインの利用や、構造が便利・簡潔になるなどの利点は増えそうですか?
やはり、プラグインによる拡張性は重視したく、慎重に選択していきたいです。

@Yangsin Yangsin added the enhancement 機能追加 label Jan 8, 2015
@shinichi-takahashi
Copy link
Author

以下ルールを提案します。

  • class_extendsはデフォルトでファイルなし状態でディレクトリだけ置いておく。
  • 命名規則にそったHoge_Ex.phpが存在すれば、そちらを見に行く
  • Hoge_Ex classはHogeを継承しなければいけない
class Hoge_Ex extends Hoge()
{
}

@shinichi-takahashi
Copy link
Author

Silexの採用に伴い、本件クローズいたします。

k-yamamura referenced this issue in k-yamamura/ec-cube Oct 7, 2015
geany-y pushed a commit to geany-y/ec-cube that referenced this issue May 12, 2016
商品ごとポイントを空で登録できない不具合の修正
kiy0taka referenced this issue in kiy0taka/ec-cube Oct 21, 2016
共通のログ出力を行うリスナを追加
kiy0taka referenced this issue in kiy0taka/ec-cube Feb 21, 2017
kiy0taka pushed a commit that referenced this issue Feb 20, 2018
kiy0taka referenced this issue in kiy0taka/ec-cube Apr 15, 2018
ryo-endo added a commit that referenced this issue Jul 20, 2018
#7 【商品一覧】規格によって値段が異なるとき、「価格が低い順」とかどういうソートになっているかわからない
ndquocphong referenced this issue in onshopVN/ec-cube Oct 10, 2019
ndquocphong referenced this issue in onshopVN/ec-cube Oct 10, 2019
…re-install-plugin

Implement display correct status of plugin/theme. Hide some unnecessa…
okazy pushed a commit that referenced this issue Aug 20, 2020
コンフリクトしていたので4.0の最新ブランチに追従しました
chrisL-meier pushed a commit to chrisL-meier/ec-cube that referenced this issue Oct 2, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement 機能追加
Projects
None yet
Development

No branches or pull requests

6 participants