0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

route 書き方の違い

Posted at

どこかでパラメータ付きURLを生成する

$url = route('users.edit', ['user' => $user->id]);
$url = route('users.edit', ['user' => $user]);

第二引数のuserがidでもmodelでも動く理由

結論

route関数を司るDatabase/eloquent/Model.phpにある**$primarykeyで決定する**
$primarykeにidが代入されているため['user' => $user]と書いてもidが参照され、取ることができる
スクリーンショット 2020-05-18 23.43.38.png

ここまでの過程

どこかでroute関数を定義する。

indexController.php
public function index ()
    {
        route();
    }
        

このrouteを⌘+クリックすると
laravelのhelper関数が集約されてるところに飛ぶ
ここではフォーマットを整えるぐらい

helpers.php
function route($name, $parameters = [], $absolute = true)
    {
        return app('url')->route($name, $parameters, $absolute);
    }

次にこのapp->のrouteが何かを辿る

ここではgetByNameはよくて、toRouteに飛びます

UrlGenerater.php
public function route($name, $parameters = [], $absolute = true)
    {
        if (! is_null($route = $this->routes->getByName($name))) {
            return $this->toRoute($route, $parameters, $absolute);
        }

        throw new InvalidArgumentException("Route [{$name}] not defined.");
    }

次にrouteUrlはいいので、formatParametersに飛びます

UrlGenerater.php
protected function toRoute($route, $parameters, $absolute)
    {
        return $this->routeUrl()->to(
            $route, $this->formatParameters($parameters), $absolute
        );
    }

肝心なのはgetRouteKey()です。

UrlGenerater.php
public function formatParameters($parameters)
    {
        $parameters = Arr::wrap($parameters);

        foreach ($parameters as $key => $parameter) {
            if ($parameter instanceof UrlRoutable) {
                $parameters[$key] = $parameter->getRouteKey();
            }
        }

        return $parameters;
    }

コメントアウトされている様にmodelのkeyでvalueをget
そして、UrlRoutabeleがinterfaceされてます。
この親はDatabase/eloquent/Model.phpになるのでそこで、結論が定義されてます。

UrlRoutable.php

interface UrlRoutable
{
    /**
     * Get the value of the model's route key.
     *
     * @return mixed
     */
    public function getRouteKey();

2番目の書き方の注意であり前提

①tableにidが設定されていること
②結論の$primarykeyでidが定義されていること

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?