1+ <?php
2+
3+ namespace A2Workspace \ModelBuilder \Concerns ;
4+
5+ use Illuminate \Support \Str ;
6+
7+ trait ResolvesBuilderNames
8+ {
9+ /**
10+ * 名稱解析器。
11+ *
12+ * @var callable
13+ */
14+ protected static $ nameResolver = null ;
15+
16+ /**
17+ * 定義 ModelBuilder 的命名空間所在。
18+ *
19+ * @var string
20+ */
21+ protected static $ namespace = 'App \\ModelBuilders \\' ;
22+
23+ /**
24+ * 定義 App 的命名空間。
25+ *
26+ * @var string
27+ */
28+ protected static $ appNamespace = 'App \\' ;
29+
30+ /**
31+ * 透過給定的 Model 名稱,取得一個新的 ModelBuilder 實體。
32+ *
33+ * @param string $modelName
34+ * @return static
35+ */
36+ public static function builderForModel (string $ modelName )
37+ {
38+ $ factory = static ::resolveBuilderName ($ modelName );
39+
40+ return new $ factory ;
41+ }
42+
43+ /**
44+ * 透過給定的 Model 名稱,嘗試取得 ModelBuilder 類別名稱。
45+ *
46+ * @param string $modelName
47+ * @return string
48+ */
49+ public static function resolveBuilderName (string $ modelName )
50+ {
51+ $ resolver = static ::$ nameResolver ?: function (string $ modelName ) {
52+ $ modelName = Str::startsWith ($ modelName , static ::$ appNamespace . 'Models \\' )
53+ ? Str::after ($ modelName , static ::$ appNamespace . 'Models \\' )
54+ : Str::after ($ modelName , static ::$ appNamespace );
55+
56+ return static ::$ namespace . $ modelName . 'Builder ' ;
57+ };
58+
59+ return $ resolver ($ modelName );
60+ }
61+
62+ /**
63+ * 指定一個函式用來處理 ModelBuilder 的名稱解析。
64+ *
65+ * @param callable $callback
66+ * @return void
67+ */
68+ public static function guessNamesUsing (callable $ callback )
69+ {
70+ static ::$ nameResolver = $ callback ;
71+ }
72+ }
0 commit comments