@@ -137,7 +137,7 @@ public function createRequest(
137137 throw new UI \InvalidLinkException ("Unknown signal ' $ signal', missing handler {$ reflection ->getName ()}:: {$ component ::formatSignalMethod ($ signal )}() " );
138138 }
139139
140- $ this ->validateLinkTarget ($ refPresenter , $ method , "signal ' $ signal' " . ($ component === $ refPresenter ? '' : ' in ' . $ component ::class));
140+ $ this ->validateLinkTarget ($ refPresenter , $ method , "signal ' $ signal' " . ($ component === $ refPresenter ? '' : ' in ' . $ component ::class), $ mode );
141141
142142 // convert indexed parameters to named
143143 UI \ParameterConverter::toParameters ($ method , $ args , [], $ missing );
@@ -166,7 +166,7 @@ public function createRequest(
166166 $ current = $ refPresenter && ($ action === '* ' || strcasecmp ($ action , $ refPresenter ->getAction ()) === 0 ) && $ presenterClass === $ refPresenter ::class;
167167
168168 $ reflection = new UI \ComponentReflection ($ presenterClass );
169- $ this ->validateLinkTarget ($ refPresenter , $ reflection , "presenter ' $ presenter' " );
169+ $ this ->validateLinkTarget ($ refPresenter , $ reflection , "presenter ' $ presenter' " , $ mode );
170170
171171 foreach (array_intersect_key ($ reflection ->getParameters (), $ args ) as $ name => $ param ) {
172172 if ($ args [$ name ] === $ param ['def ' ]) {
@@ -176,7 +176,7 @@ public function createRequest(
176176
177177 // counterpart of run() & tryCall()
178178 if ($ method = $ reflection ->getActionRenderMethod ($ action )) {
179- $ this ->validateLinkTarget ($ refPresenter , $ method , "action ' $ presenter: $ action' " );
179+ $ this ->validateLinkTarget ($ refPresenter , $ method , "action ' $ presenter: $ action' " , $ mode );
180180
181181 UI \ParameterConverter::toParameters ($ method , $ args , $ path === 'this ' ? $ refPresenter ->getParameters () : [], $ missing );
182182
@@ -296,9 +296,12 @@ private function validateLinkTarget(
296296 ?UI \Presenter $ presenter ,
297297 \ReflectionClass |\ReflectionMethod $ element ,
298298 string $ message ,
299+ string $ mode ,
299300 ): void
300301 {
301- if ($ presenter ?->invalidLinkMode
302+ if ($ mode !== 'forward ' && !(new UI \AccessPolicy ($ element ))->isLinkable ()) {
303+ throw new UI \InvalidLinkException ("Link to forbidden $ message from ' {$ presenter ->getName ()}: {$ presenter ->getAction ()}'. " );
304+ } elseif ($ presenter ?->invalidLinkMode
302305 && (UI \ComponentReflection::parseAnnotation ($ element , 'deprecated ' ) || $ element ->getAttributes (Attributes \Deprecated::class))
303306 ) {
304307 trigger_error ("Link to deprecated $ message from ' {$ presenter ->getName ()}: {$ presenter ->getAction ()}'. " , E_USER_DEPRECATED );
0 commit comments