99use PhpMcp \Server \Exception \DefinitionException ;
1010use PhpMcp \Server \Model \Capabilities ;
1111use PhpMcp \Server \State \ClientStateManager ;
12+ use PhpMcp \Server \Support \HandlerResolver ;
1213use Psr \Container \ContainerInterface ;
1314use Psr \Log \LoggerInterface ;
1415use Psr \Log \NullLogger ;
@@ -44,9 +45,7 @@ final class ServerBuilder
4445
4546 private array $ manualPrompts = [];
4647
47- public function __construct ()
48- {
49- }
48+ public function __construct () {}
5049
5150 /**
5251 * Sets the server's identity. Required.
@@ -208,16 +207,16 @@ private function performManualRegistrations(Registry $registry, LoggerInterface
208207 // Register Tools
209208 foreach ($ this ->manualTools as $ data ) {
210209 try {
211- $ methodRefl = $ this -> validateAndGetReflectionMethod ($ data ['handler ' ]);
210+ $ resolvedHandler = HandlerResolver:: resolve ($ data ['handler ' ]);
212211 $ def = Definitions \ToolDefinition::fromReflection (
213- $ methodRefl ,
212+ $ resolvedHandler [ ' reflectionMethod ' ] ,
214213 $ data ['name ' ],
215214 $ data ['description ' ],
216215 $ docBlockParser ,
217216 $ schemaGenerator
218217 );
219218 $ registry ->registerTool ($ def , true );
220- $ logger ->debug ("Registered manual tool ' {$ def ->getName ()}' " );
219+ $ logger ->debug ("Registered manual tool ' {$ def ->getName ()}' from handler { $ resolvedHandler [ ' className ' ]} :: { $ resolvedHandler [ ' methodName ' ]} " );
221220 } catch (Throwable $ e ) {
222221 $ errorCount ++;
223222 $ logger ->error ('Failed to register manual tool ' , ['handler ' => $ data ['handler ' ], 'name ' => $ data ['name ' ], 'exception ' => $ e ]);
@@ -227,9 +226,9 @@ private function performManualRegistrations(Registry $registry, LoggerInterface
227226 // Register Resources
228227 foreach ($ this ->manualResources as $ data ) {
229228 try {
230- $ methodRefl = $ this -> validateAndGetReflectionMethod ($ data ['handler ' ]);
229+ $ resolvedHandler = HandlerResolver:: resolve ($ data ['handler ' ]);
231230 $ def = Definitions \ResourceDefinition::fromReflection (
232- $ methodRefl ,
231+ $ resolvedHandler [ ' reflectionMethod ' ] ,
233232 $ data ['name ' ],
234233 $ data ['description ' ],
235234 $ data ['uri ' ],
@@ -239,7 +238,7 @@ private function performManualRegistrations(Registry $registry, LoggerInterface
239238 $ docBlockParser
240239 );
241240 $ registry ->registerResource ($ def , true );
242- $ logger ->debug ("Registered manual resource ' {$ def ->getUri ()}' " );
241+ $ logger ->debug ("Registered manual resource ' {$ def ->getUri ()}' from handler { $ resolvedHandler [ ' className ' ]} :: { $ resolvedHandler [ ' methodName ' ]} " );
243242 } catch (Throwable $ e ) {
244243 $ errorCount ++;
245244 $ logger ->error ('Failed to register manual resource ' , ['handler ' => $ data ['handler ' ], 'uri ' => $ data ['uri ' ], 'exception ' => $ e ]);
@@ -249,9 +248,9 @@ private function performManualRegistrations(Registry $registry, LoggerInterface
249248 // Register Templates
250249 foreach ($ this ->manualResourceTemplates as $ data ) {
251250 try {
252- $ methodRefl = $ this -> validateAndGetReflectionMethod ($ data ['handler ' ]);
251+ $ resolvedHandler = HandlerResolver:: resolve ($ data ['handler ' ]);
253252 $ def = Definitions \ResourceTemplateDefinition::fromReflection (
254- $ methodRefl ,
253+ $ resolvedHandler [ ' reflectionMethod ' ] ,
255254 $ data ['name ' ],
256255 $ data ['description ' ],
257256 $ data ['uriTemplate ' ],
@@ -260,7 +259,7 @@ private function performManualRegistrations(Registry $registry, LoggerInterface
260259 $ docBlockParser
261260 );
262261 $ registry ->registerResourceTemplate ($ def , true );
263- $ logger ->debug ("Registered manual template ' {$ def ->getUriTemplate ()}' " );
262+ $ logger ->debug ("Registered manual template ' {$ def ->getUriTemplate ()}' from handler { $ resolvedHandler [ ' className ' ]} :: { $ resolvedHandler [ ' methodName ' ]} " );
264263 } catch (Throwable $ e ) {
265264 $ errorCount ++;
266265 $ logger ->error ('Failed to register manual template ' , ['handler ' => $ data ['handler ' ], 'uriTemplate ' => $ data ['uriTemplate ' ], 'exception ' => $ e ]);
@@ -270,15 +269,15 @@ private function performManualRegistrations(Registry $registry, LoggerInterface
270269 // Register Prompts
271270 foreach ($ this ->manualPrompts as $ data ) {
272271 try {
273- $ methodRefl = $ this -> validateAndGetReflectionMethod ($ data ['handler ' ]);
272+ $ resolvedHandler = HandlerResolver:: resolve ($ data ['handler ' ]);
274273 $ def = Definitions \PromptDefinition::fromReflection (
275- $ methodRefl ,
274+ $ resolvedHandler [ ' reflectionMethod ' ] ,
276275 $ data ['name ' ],
277276 $ data ['description ' ],
278277 $ docBlockParser
279278 );
280279 $ registry ->registerPrompt ($ def , true );
281- $ logger ->debug ("Registered manual prompt ' {$ def ->getName ()}' " );
280+ $ logger ->debug ("Registered manual prompt ' {$ def ->getName ()}' from handler { $ resolvedHandler [ ' className ' ]} :: { $ resolvedHandler [ ' methodName ' ]} " );
282281 } catch (Throwable $ e ) {
283282 $ errorCount ++;
284283 $ logger ->error ('Failed to register manual prompt ' , ['handler ' => $ data ['handler ' ], 'name ' => $ data ['name ' ], 'exception ' => $ e ]);
@@ -291,56 +290,4 @@ private function performManualRegistrations(Registry $registry, LoggerInterface
291290
292291 $ logger ->debug ('Manual element registration complete. ' );
293292 }
294-
295- /**
296- * Gets a reflection method from a handler.
297- *
298- * @throws \InvalidArgumentException If the handler is invalid.
299- */
300- private function validateAndGetReflectionMethod (array |string $ handler ): \ReflectionMethod
301- {
302- $ className = null ;
303- $ methodName = null ;
304-
305- if (is_array ($ handler )) {
306- if (count ($ handler ) !== 2 || ! is_string ($ handler [0 ]) || ! is_string ($ handler [1 ])) {
307- throw new \InvalidArgumentException ('Invalid array handler format. Expected [ClassName::class, \'methodName \']. ' );
308- }
309- [$ className , $ methodName ] = $ handler ;
310- if (! class_exists ($ className )) {
311- throw new \InvalidArgumentException ("Class ' {$ className }' not found for array handler. " );
312- }
313- if (! method_exists ($ className , $ methodName )) {
314- throw new \InvalidArgumentException ("Method ' {$ methodName }' not found in class ' {$ className }' for array handler. " );
315- }
316- } elseif (is_string ($ handler ) && class_exists ($ handler )) {
317- $ className = $ handler ;
318- $ methodName = '__invoke ' ;
319- if (! method_exists ($ className , $ methodName )) {
320- throw new \InvalidArgumentException ("Invokable class ' {$ className }' must have a public '__invoke' method. " );
321- }
322- } else {
323- throw new \InvalidArgumentException ('Invalid handler format. Expected [ClassName::class, \'methodName \'] or InvokableClassName::class string. ' );
324- }
325-
326- try {
327- $ reflectionMethod = new \ReflectionMethod ($ className , $ methodName );
328- if ($ reflectionMethod ->isStatic ()) {
329- throw new \InvalidArgumentException ("Handler method ' {$ className }:: {$ methodName }' cannot be static. " );
330- }
331- if (! $ reflectionMethod ->isPublic ()) {
332- throw new \InvalidArgumentException ("Handler method ' {$ className }:: {$ methodName }' must be public. " );
333- }
334- if ($ reflectionMethod ->isAbstract ()) {
335- throw new \InvalidArgumentException ("Handler method ' {$ className }:: {$ methodName }' cannot be abstract. " );
336- }
337- if ($ reflectionMethod ->isConstructor () || $ reflectionMethod ->isDestructor ()) {
338- throw new \InvalidArgumentException ("Handler method ' {$ className }:: {$ methodName }' cannot be a constructor or destructor. " );
339- }
340-
341- return $ reflectionMethod ;
342- } catch (\ReflectionException $ e ) {
343- throw new \InvalidArgumentException ("Reflection error for handler ' {$ className }:: {$ methodName }': {$ e ->getMessage ()}" , 0 , $ e );
344- }
345- }
346293}
0 commit comments