0

顧客が注目すべき重要なリンクがいくつかあります。たとえば、次のとおりです。

  • お問い合わせ @ domain.com/home/contact
  • サービスについて @ domain.com/home/service
  • 価格 @ domain.com/home/pricing
  • 仕組み @ domain.com/home/how_it_works

そのようなもの。URL からホームコントローラーを非表示にしたいので、顧客には/home/contact /ではなく/ contact/のみが表示されます。/home/pricing /ではなく/pricing/と同じ

特別なページごとにコントローラーまたはルートをセットアップできることはわかっていますが、データベースから取得するコンテンツを除いてそれらは同じように見えるため、コードを DRY のままにしておくことをお勧めします。

次のルートを設定します。

Route::get('/about_us', 'home@about_us');
Route::get('/featured_locations', 'home@featured_locations');

これはうまくいきますが、URL のコントローラーとのリンクにコンテンツが重複していると、SEO のトラブルが発生する恐れがあります。(両方を使用する予定はありませんが、私はもっとばかげたことをすることが知られています。)

次に、次のようなルートを作成しました。

Route::get('/about_us', 'home@about_us');
Route::get('/home/about_us', function() 
{ 
    return Redirect::to('/about_us', 301);
});

Route::get('/featured_locations', 'home@featured_locations');
Route::get('/home/featured_locations', function() 
{ 
    return Redirect::to('/featured_locations', 301);
});

そして今、私はリダイレクトを持っています。ばかげているように感じますが、私が望むように機能しているようです。短い URL でページを読み込むと、コンテンツが読み込まれます。長い URL にアクセスしようとすると、リダイレクトされます。

特殊なリンクが8~9本程度しかないのでルート管理は楽ですが、何か工夫が必要かなと感じています。

これは PHP の問題ですか、それとも .htaccess / web.config の問題ですか?

このリダイレクト スキームで一体何を作成したのでしょう。賢い人はどうやってそれをするのですか?2 時間検索しましたが、自分がしていることを説明する用語が見つかりません。

これを処理するlaravel 4に組み込まれているものはありますか?

アップデート:

これが、答えの1つを実装する私の試みです。これは機能しておらず、何が間違っているのかわかりません

アプリケーション/routes.php

Route::controller('home');

Route::controller('Home_Controller', '/');

(本当に壊れたコードを見たい場合は、編集履歴を見ることができます)

そして今、 domain.com / AboutYoudomain.com/aboutUsは 404 を返しています。

最終編集

PongoCMS の routes.php (Laravel 3 に基づく)からアイデアをコピーしたところ、フィルタを使用して URI セグメントを取得し、CMS ページを作成しようとしていることがわかりました。

route filters を使用して、以下の私の回答を参照してください。この新しい方法では、すべての特別なルートを登録する必要はありませんが (良い)、正規ルートへのリダイレクトを放棄します (悪い)。

4

2 に答える 2

0

これをroutes.phpに入れてください:

Route::controller('HomeController', '/');

これは、HomeControllerにWebサイトのルートにルーティングするように指示しています。次に、HomeControllerから、そこから任意の関数にアクセスできます。接頭辞として正しい動詞を付けてください。また、laravelはPSR-0およびPSR-1標準に準拠しているため、メソッドはキャメルケースになっていることに注意してください。したがって、次のようなものになります。

domain.com/aboutUs

HomeControllerの場合:

<?php

class HomeController extends BaseController 
{
    public function getAboutUs()
    {
        return View::make('home.aboutus');
    }
}
于 2013-01-20T15:00:53.640 に答える
0

それには、routes.php とフィルターを使用しました。見栄えの良い PongoCMS からアイデアをコピーしました

https://github.com/redbaron76/PongoCMS-Laravel-cms-bundle/blob/master/routes.php

アプリケーション/routes.php

// automatically route all the items in the home controller

Route::controller('home');

// this is my last route, so it is a catch all.  filter it

Route::get('(.*)', array('as' => 'layouts.locations', 'before' => 'checkWithHome', function() {}));

Route::filter('checkWithHome', function()
{
    // if the view isn't a route already, then see if it is a view on the 
    // home controller.  If not, then 404
    $response = Controller::call('home@' . URI::segment(1));
    if ( ! $response )
    {
        //didn't find it
        return Response::error('404');
    }
    else
    {
        return $response;
    }

});

私が見る主な問題は、フィルターが基本的に成功したすべてのページを2回ロードすることです。ドキュメントに、ページが存在するかどうかを検出するメソッドがありませんでした。おそらくそれを行うためのライブラリを作成できます。

もちろん、この最終バージョンでは、何かを見つけた場合は、それをページにダンプして、ルートの処理を停止できます。このようにして、すべてのリソースを一度だけロードします。

アプリケーション/コントローラー/home.php

public function get_aboutUs()
{
        $this->view_data['page_title'] = 'About Us';
        $this->view_data['page_content'] = 'About Us';

        $this->layout->nest('content', 'home.simplepage', $this->view_data);
}

public function get_featured_locations()
{
        $this->view_data['page_title'] = 'Featured Locations';
        $this->view_data['page_content'] = 'Featured properties shown here in a pretty row';

        $this->layout->nest('content', 'home.simplepage', $this->view_data);
}

public function get_AboutYou()
{
    //works when I return a view as use a layout
    return View::make('home.index');
}
于 2013-01-21T09:02:29.637 に答える