Laravel在Application.php的核心注册了很多默认实现,如下所示:
'url' => ['Illuminate\Routing\UrlGenerator', 'Illuminate\Contracts\Routing\UrlGenerator'],
Run Code Online (Sandbox Code Playgroud)
这将有效地将下面的方法称为两次
public function alias($abstract, $alias)
{
$this->aliases[$alias] = $abstract;
}
Run Code Online (Sandbox Code Playgroud)
导致以下值Container->aliases:
"Illuminate\Routing\UrlGenerator" => "url"
"Illuminate\Contracts\Routing\UrlGenerator" => "url"
Run Code Online (Sandbox Code Playgroud)
如果我稍后调用:
$this->app->alias('url', 'App\Util\Portal\UrlGenerator');
它甚至将它存储在Container的别名数组中:
"App\Util\Portal\UrlGenerator" => "url"
Run Code Online (Sandbox Code Playgroud)
我的问题:
为什么laravel将它们全部存储两到三个而不是覆盖它们?存储具体类应该足够了.但是为什么laravel会将它们全部存储起来?当我现在使用App :: make('url')时,laravel如何判断哪一个要解决?Laravel现在有三个可供选择,一个接口和两个实现.
给出错误:
$this->model::byUserPermission()
Leads to: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM)
Run Code Online (Sandbox Code Playgroud)
作品:
$facade = $this->model;
$facade::byUserPermission()
Run Code Online (Sandbox Code Playgroud)
这是一个PHP Bug吗?或者有人可以向我解释这个,为什么会发生这种情况(我使用的是php 5.6,而且我是php新手.从我的观点来看,两者完全相同).谢谢
鉴于我有一个这样映射的任意URL(以及许多其他URL)
...
Route::get('/foobar/{parameter}', 'MyFoobarController@index');
...
Run Code Online (Sandbox Code Playgroud)
如何再次将URL(like http://localhost/foobar/foo)反向解析/解析到此已配置的控制器(MyFoobarController)中?请注意:我不是在谈论当前的请求,而是一种通用的方法来解析Laravel中映射到其相应的Controller and Action(在代码中与当前请求无关的任何地方)的任何URL。谢谢!
更新:还应该正确匹配其中包含参数的路由。
我需要使用的自定义实现UrlGenerator。因此,我该如何更改laravel的默认绑定,该默认绑定在内核深处实现为
'url' => ['Illuminate\Routing\UrlGenerator', 'Illuminate\Contracts\Routing\UrlGenerator'],
Run Code Online (Sandbox Code Playgroud)
反对我自己的实现?
此外,我也不是很自信。我认为上面的这一行实际上做了两件事。它将bindinung存储在键“ url”下,并且还将接口映射到类。所以我实际上需要覆盖两者!怎么做?此外,如何确定是否必须将其绑定为“共享”(单例)或“每次新实例”?
非常感谢!