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での通常のエラー。 提案と批判-コメントで。 ご清聴ありがとうございました。