URLとその使用例を生成するための便利なツールを共有したいと思います。
タスクはそれほど大きくはありませんが、常に発生するものであり、それを解決するために
自転車を
書くのに費やす時間を減らしたいと思います。 また、さまざまなクラス、メソッド、関数などの呼び出しの広範な使用を取り除き、必要に応じてURLを生成します。 ああ、私は
Laravelを使用していますが、そのためにツールが投獄されています。
ツールリンク
これで十分です。
問題の声明
/ resource / 1の代わりに
/ resource / unique-resource-urlを介してアクセスするためのデータベーステーブルのエントリの一意のURLの自動生成。
降りる
ユーザーがサイト製品のリストを表示するときにどの地域/都市が選択されているかを簡単にナビゲートできるように、国と都市でサイトの検索を中断する必要があるとします。
新しいプロジェクトを作成することから始めましょう。
composer create-project laravel/laravel habr_url --prefer-dist
次に、
habr_urlのルートで
composer.jsonを開き 、
必要なパッケージを
追加します。
{ "name": "laravel/laravel", "description": "The Laravel Framework.", "keywords": ["framework", "laravel"], "license": "MIT", "require": { "laravel/framework": "4.1.*", "ivanlemeshev/laravel4-cyrillic-slug": "dev-master", "cviebrock/eloquent-sluggable": "1.0.*", "way/generators": "dev-master" }, "autoload": { "classmap": [ "app/commands", "app/controllers", "app/models", "app/database/migrations", "app/database/seeds", "app/tests/TestCase.php" ] }, "scripts": { "post-install-cmd": [ "php artisan optimize" ], "post-update-cmd": [ "php artisan clear-compiled", "php artisan optimize" ], "post-create-project-cmd": [ "php artisan key:generate" ] }, "config": { "preferred-install": "dist" }, "minimum-stability": "dev" }
"way/generators": "dev-master"は、迅速なプロトタイプ作成のために追加します。
コンソールで
composer updateコマンドを実行し、パッケージが正常にインストールされた後、
app / config / app.phpに変更を加えます。
<?php return array(
標準の
Strクラスはラテン語でのみ機能するため、
Slugクラスを使用するとキリル文字からURLを生成できます。
Sluggableについては
後ほど説明します。
コードを生成する
php artisan generate:scaffold create_countries_table --fields="name:string:unique, code:string[2]:unique" php artisan generate:scaffold create_cities_table --fields="name:string, slug:string:unique, country_id:integer:unsigned" php artisan generate:scaffold create_products_table --fields="name:string, slug:string:unique, price:integer, city_id:integer:unsigned"
外部キーを追加して新しいファイルを変更します。
また、
seedsを通じてデータベースにいくつかの国と都市を追加します。
app / database / seedsフォルダーを開き、2つのファイルを変更します。
これは
Slug::make($input)を使用します。これは
$inputを文字列として受け取り、そこから
moskvaまたは
sankt-peterburg似たものを生成
sankt-peterburgます。
次に、データベース設定を変更します。
そして、スキームとデータをデータベースに取り込みます。
php artisan migrate --seed
そして、これが私たちが得たものです:


リンクモデルに追加し、属性のルールを追加します。
CitiesControllerおよび
ProductsController storeメソッドを
CitiesControllerます。
アプリ/ビュー/都市/create.blade.php 、
アプリ/ビュー/都市/edit.blade.php 、
アプリ/ビュー/製品/create.blade.php 、
アプリ/ビュー/製品/edit.blade.phpから削除します対応するフォーム要素。
素晴らしい、
URL生成され
URL 、それらが複製されるとどうなりますか? エラーが発生します。 そしてこれを避けるために-
slug一致する場合、接頭辞を追加する必要があり、接頭辞がある場合はそれをインクリメントします。 多くの作業がありますが、優雅さはありません。 これらのジェスチャーを避けるために、
Eloquent Sluggableを使用し
Eloquent Sluggable 。
まず、
Eloquent Sluggableの構成をプロジェクトにドロップしましょう。
php artisan config:publish cviebrock/eloquent-sluggable
ここにある設定ファイル
app / config / cviebrock / eloquent-sluggable / config.phpで 、オプション
'method' => nullを
'method' => array('Slug', 'make')ます。 したがって、キリル文字から音訳への変換と
URL作成のタスクは、(キリル文字の操作方法を知らない標準の
Strではなく)
Slugクラスとその
makeメソッドに割り当てられ
URL 。
このパッケージは何に適していますか? この原則に基づいて動作します。データベースにレコードを保存する
eloquent.saving*イベントを想定し、生成された
slugをモデル設定で指定されたフィールドに書き込みます。 設定例:
既存の
slugと一致する場合、接頭辞
-1 、
-2などが新しいものに追加されます。 さらに、
slugの
CitiesController@storeルールを取り除き、
CitiesController@storeメソッドの
$input['slug'] = Slug::make(Input::get('name', ''));という
CitiesController@store $input['slug'] = Slug::make(Input::get('name', '')); 。
Productについても同じことを行います。
City Modelで
$sluggableを次のように書き換えると、この
slugでさらに興味深いことができます。
はい、オブジェクトから存在しないフィールドを選択し、ヘルパーとして追加できます。
CitiesTableSeederをわずかに変更して、目的の結果を達成します。
次に、移行をロールバックし、データとともに新しい移行を入力します。
php artisan migrate:refresh --seed

いくつかのルートを追加します。
そして、いくつかのパターンを追加します。
<!-- app/views/nav.blade.php --> <ul class="nav nav-pills"> @foreach(Country::all() as $country) <li><a href="{{{ route('country', $country->code) }}}">{{{ $country->name }}}</a> @endforeach </ul>
<!-- app/views/products.blade.php --> @extends('layouts.scaffold') @section('main') @include('nav') <h1>Products</h1> @if ($products->count()) <table class="table table-striped table-bordered"> <thead> <tr> <th>Name</th> <th>Price</th> <th>City</th> </tr> </thead> <tbody> @foreach ($products as $product) <tr> <td><a href="{{{ route('product', $product->slug)}}}">{{{ $product->name }}}</a></td> <td>{{{ $product->price }}}</td> <td><a href="{{{ route('city', $product->city->slug) }}}">{{{ $product->city->name }}}</a></td> </tr> @endforeach </tbody> </table> @else There are no products @endif @stop
<!-- app/views/product.blade.php --> @extends('layouts.scaffold') @section('main') @include('nav') <h1>Product</h1> <table class="table table-striped table-bordered"> <thead> <tr> <th>Name</th> <th>Price</th> <th>City</th> </tr> </thead> <tbody> <tr> <td>{{{ $product->name }}}</td> <td>{{{ $product->price }}}</td> <td><a href="{{{ route('city', $product->city->slug) }}}">{{{ $product->city->name }}}</a></td> </tr> </tbody> </table> @stop
以上です。
デモとGit
PMでの通常のエラー。 提案と批判-コメントで。 ご清聴ありがとうございました。